【sqli-labs】 less24 POST- Second Order Injections *Real treat* -Stored Injections (POST型二阶注入 *真的好玩?* 存储注入)

简单登陆浏览一遍后,发现是一个登陆注册修改密码的应用

审查一下代码

登陆页面的username,password使用了转义

注册页面的参数也进行了转义处理

但是在修改password的页面,直接从session中获取了username

这样就有了一个问题,username是在注册时被创建的,虽然进行了转义,但是没有做输入字符的限制

看一下修改密码的sql语句

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

如果username=admin'#就会构成,#号后面的变成了注释,那么我们就修改了admin的密码

UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'

来测试一下

成功注册,数据库中也添加了对应的数据

也可以正常的登陆

然后我们来修改密码

为了方便观察,将sql语句输出一下

 提示密码修改成功

这样我们就将admin的密码修改为123456

可以在数据库中确认一下

 我们来看一下mysql_escape_string这个函数做了什么来防止注入

输出一下SQL语句

 很明显将admin'# 变成了 admin\'#即将’转义成了\'

#在双引号中无法完成注释的功能

同样"也会被转义成\",这样使得引号无法被注入闭合,username始终是一个字符串

既然这个函数是通过无法闭合单双引号来实现防注入的,那么对于整型的参数就不能做过滤了

测试一下

<!DOCTYPE html>
<html>
<head>
    <title>mysql_escape_string_test</title>
    <meta charset="utf-8" />
</head>
<body>
<?php
    $id = mysql_escape_string($_GET['id']);
    $sql = "select * from users where id=" . $id . " limit 0,1;";
    echo "SQL语句为:" . $sql . "</br>";
?>    
</body>
</html>

 

这个语句可以正常的执行

 

posted @ 2018-01-26 21:15  omnis  阅读(421)  评论(0)    收藏  举报