【BUUCTF-Web】[CISCN2019 华北赛区 Day2 Web1]Hack World

615 阅读2分钟

Subject

SQL Injection


Mind Palace

输入URL获得提示 => table = flag;column = flag

提交 1 获得

BP抓包发现 POST 请求 请求的内容 id

盲猜数字型注入;使用 1 and 1=1;# 测试

说明需要进行绕过;尝试 1 order by 2;# 失败

双写尝试 1 anandd 1=1;# 失败

大小写换乱尝试 1 AnD 1;# 失败

尝试只输入一个'

输入其他除开1或2的值都是返回 false

另外:

但是

确定是数字型SQL注入;并且过滤了许多字段(包括但不限于union、and、or、空格)

=> 猜测没有过滤左右括号(如果没有且函数名也没有被过滤就可以使用函数)

正常返回 => 可以使用括号

确定本题是布尔盲注且有大量过滤;还剩下一个问题是如何绕过空格

尝试 %00 ;发现会是 SQL 语句执行异常

尝试 %0a 0b ...

正常返回;空格绕过方式为:%0a

下面开始构造payload => 由于 and 也被过滤了(并且暂时没有找到绕过的方式)

再鉴于左右括号的可用 => 使用 MySQL 的 IF 函数

编写Python代码进行布尔盲注:

返回的是 id=1 的回显 => 说明flag第一个字符为 f ;根据此编写代码

这里出现的问题是:Python代码在基本无错误的情况下但是直接返回了false => 说明' 单引号需要 urlencode => 失败了

说明虽然在BP中可以通过 %0a 绕过空格但是在 Python 代码中不能做到 => 猜测Python处理字符串的时候会有和直接在BP中输入的底层情况不一样(需要深入理解Python的字符串及相关情况 此处挖坑)

payload:
py = f"if(ascii(mid((select(flag)from(flag)),1,1))=ascii('f'),1,2)"


Look Ahead

根据不同情况下的过滤情况采用不同方式的注入;

并且在debug代码的时候尽量把代码写的清晰明了


END ヾ(^∀^)ノ