Safety Small Classroom No. 113 [Second Injection Vulnerability Mining]

www-secpulse-com
12-10-2018

#1

因为平时工作比较忙,没来得及去找实例,这部分内容,简单阐述下。

现在大部分的CTF比赛,上面的SQL注入漏洞,都不再是常规的普通注入和绕过利用。

举个例子:

$content=addslashes($_POST['title']);
$insert="INSERT INTO A(title,desc)VALUES('$title', '$desc')";

很简单的一个插入语句,服务器在插入文章title的过程中使用addsashes进行转义,双引号、单引号、反斜杠、空格都会被添加一个反斜杠,乍一看是不太好实现SQL注入的,但是如果查询页面是这样

$id= addslashes($_GET['id']);
$select_sql="SELECT *FROM A WHERE title='$id'";

虽然也被转义,但是在第一步的时候,通过addslashes转义的内容()不会插入到数据库中,那我们可以发布一篇文章,title构造成aaa’ union select user(),database()到数据库中,在通过第二段的访问页面找到文章对应的id,访问,便可看到user()和database()信息。

例子:

$sql = "UPDATE users set PASSWORD=’$passwd’WHERE USERNAME=’$username’ AND OLD_PASS = ‘$oldpass’";

很简单的一句sql,能看出就是一条修改密码的语句,逻辑和内容上都没有问题,那么对于二次注入,问题就从这个$username开始,好多起名字的地方,没有进行严格的昵称校验,导致任何内容都可以写,那么如果系统中存在admin账户,而我们又不知道密码怎么办?新建一个用户,命名为admin’–,admin和admin’–在创建时系统会把它识别为不同用户,可以创建通过,但是在查询的过程中,单引号”’”则为闭合,”–”则为注释,那么查询语句就变成了

$sql = "UPDATE users set PASSWORD=’$passwd’WHERE USERNAME=’admin’--’ AND OLD_PASS = ‘$oldpass’";

后面的历史密码校验,完全被注释掉,这样,我们就可以通过admin’–用户实现修改admin用户的密码,整个逻辑均属于正常流程。

Original links

https://www.secpulse.com/archives/76506.html