版权声明:本教程为笔者原创,转载需征求笔者同意。
2.2 基于报错的 SQL 注入 PoC 编写
这次我们选择的漏洞为 CmsEasy 5.5 UTF-8 20140802/celive/live/header.php SQL注入漏洞。(http://wooyun.org/bugs/wooyun-2010-070827)
2.2.1 漏洞分析
漏洞分析在原文已经说的很详细了,大可以回原文查看。
我们在编写 PoC 的时候,如果原文中已经给出了具体的利用办法,我们就无需再关注整个漏洞的成因和原理,我们只用看这个漏洞的复现方式。
阅读原文后我们得到了 payload 和 目标 URL。
2.2.2 漏洞复现
一般来说不推荐使用已经在线的站点做测试,因为一旦目标跑了一个比较重要的业务,倘若出了点问题,会对目标造成不可估量的损害。
下载地址(http://pan.baidu.com/s/1i4lAwBF)
读者下载完安装包后,按照官方说明安装 CmsEasy 安装包。安装过程就不在此缀述。我将 其安装在网站目录下的 cmseasy 目录中。
安装完毕后,我们就可以进行手工复现利用过程了。
该漏洞的注入点在 POST 数据部分,我们需要发起一个 POST 请求,我们选择 Firefox 浏览器和 HackBar 插件。填上目标 url 和 payload,然后发送。可以看到返回页面报错,而报错信息中出现了 cmseasy_user 表中的数据(图 2-1)。
图 2-1
既然已经成功复现,那就可以进行 PoC 的编写了。
2.2.3 无框架 PoC 编写
按理来说,这个 Payload 是已经可以证明漏洞存在了,但是,如果将 PoC 应用到扫描类的产品当中时,这些 Payload 原则上是不允许的。很多人一开始也不会注意这些。我们要注意下面几个原则:
-
无损扫描
也就是要求不能对目标服务器有任何危害,所以我们在扫描的时候,是不能够把目标管理员的账号和密码直接注出到扫描报告当中的,但是我们要证明目标存在漏洞,所以我们只要能证明可以执行 SQL 指令就好了,比如:
-
呐,就像上面代码中的那样。如果 ‘Medi’ 这个字符串出现在了返回的页面 中,那就证明我们的指令执行了。
-
减少误报漏报
误报和漏报两者相伴相随。找漏洞这事,就和警察叔叔抓犯罪嫌疑人一样,漏报率低了,那么误报率就高了,嗯,你把全中国的人都抓了,里面肯定有潜逃的罪犯。如果误报率低了,那么相对的,漏报率就上去了,还是警察叔叔抓坏人,一抓一个准,但是这样的话,肯定就会有很多漏网之鱼了。所以就需要找到一个平衡点。
一般来说,大部分人追求的原则是可以漏报,但不能误报。你愿意走在路上给人抓去当嫌犯嘛。
那么再回来看上面说的,如果我们检测页面返回的内容当中有 ‘Medi’, 那就证明存在注入,这么去检测的话,这误报率简直高到要爆表啊,不信你检测下我的博客,保证你每一条链接都报注入。因为我的博客的每一个链接返回的页面里面都会带有 ‘Medi’ 这个字符。
那么这就要求我们判断的字符串在正常的页面中要尽可能不会经常出现。比如我们会输出一串 md5 的值到页面中
这样就能百分百的说不会误报了吗?当然不可能。如果那个页面就是闲的慌输出了一串和你判断逻辑一样的 md5 的值,那你不就傻了?但是这也是无法避免的,可是这种巧合实在是太少见了
哦,最后再多说两句,为什么选 md5 呢,因为 mysql 里面有 md5 这个函数呀,写起来多简单呀,要是像 Oracle 数据库里面没 md5 这个函数怎么办呢?往上瞅瞅,看到了没?我们有 char() 函数(Oracle 里面是 chr()),可以把 ASCII 码转化成字符串,明白了吧?手动多打几个随机字符就好啦。
好了,来看看我们修改之后的 Payload :
md5(233) 的值就是 e165421110ba03099a1c0393373c5b43
图 2-2
好吧来写 PoC 了。
目的是发送一个 POST 请求,于是我们写一个可以发送 POST 数据的程序:
代码 2_2_1.html
:
将上面的代码保存成 2_2_1.html
然后用浏览器打开(如图 2-3)。
图 2-3
然后点击按钮提交,看效果达到了吧?(如图 2-4)
图2-4
呐,上面那段 HTML 的代码,就是所谓的 PoC 了。
WTF? 这玩意儿就是 PoC ?
是的你没有看错,这就是 PoC。是不是太简单了?我一开始就说过,PoC 是证明漏洞存在的代码,而代码实现起来,是没有语言之分的。
好吧,道理讲明白了,那还是看看 Python 是怎么实现的吧。
代码 2_2_2.py
:
将上述代码保存为 2_2_2.py
然后执行 python 2_2_2.py http://localhost/cmseasy/
可以看到下面的结果:
然后我们试着换一个其它的 url :
呐,这时候返回了 404 错误,嗯,代码2_2_2.py
就是这个漏洞的 python 语言的 PoC 了。
下面简单讲一下这个代码做了什么:
main 方法里面大概处理了一下用户的输入
verify 方法里面先是拼接了一下要发送的目的 url, 然后把 post_data(也就是我们的 Payload)发送到目的 url, 最后再处理了一下服务端的响应页面。
怎么样?是不是感觉整个过程就像是你自己在用浏览器去手工验证一样?
当然上述的代码,实际运行的时候还是需要改进的,毕竟有很多细节的地方还需要再完善。比如说我们的输入部分,试想一下啊,每一个 PoC 都要你自己去写一下这个输入代码,假设你有 10000W 个 PoC, 天呐这要浪费我多少存储空间啊,这太冗佘了吧,而且你想让每个人都能想到那么多特殊情况,是不是很不现实,毕竟有很多人想不到这么些个情况。
你说,老子有钱,不怕占空间。
好,那再看,上面的那些代码,输出结果的时候,就用了一个 print , 显然这样的输出很不友好,而且一个 PoC 还不能支持批量扫描,如果你想加载多个 PoC 去扫描多个目标的时候,这样的代码会让你抓狂的。
于是,就有了 PoC 框架,有效避免了你重复造轮子,帮你处理输入,帮你处理输出,专业的事情交给专业的人去做,然后 BalaBala…
点击“阅读原文”就可以跟Medici.Yan在评论区交流了哦
本文始发于微信公众号(inn0team):PoC 编写指南(第 2 章 SQL 注入类 PoC 编写 二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论