目录
二次注入的原理:
实战:
第一步:找注入点
找漏洞:
注入大概过程:
第二步:开始注入
二次注入的原理:
二次注入是由于对用户输入的数据过滤不严谨,导致存在异常的数据被出入数据库中;当我们从数据库中二次使用该数据时就会产生注入行为。
二次注入也是较为常见的注入方式。
实战:
我们在sql靶场进行操作,本次的实战是sql靶场的第二十四关:
第一步:找注入点
我们通过查看源码可知,此关卡共有一下几个php页面。
经过大致的解读代码,这几个页面中可能存在注入点的php页面为pass_change.php,login.php,login_create.php三个页面。这三个页面的功能分别为修改密码,登录,创建新用户。
找漏洞:
我们观察这三个页面的php关键代码:
login.php:
login_create.php:
pass_change.php:
我们发现在我们输入的关键字段都被函数:mysql_real_escape_string()过滤了。这个函数的意思是对用户输入的敏感字符进行转义(在关键字符上连接一个反斜线进行转义),我们去php官网查看:
缺陷:该函数虽然可以对用户输入的进行过滤,但是在写入数据库中时并不会将其一并代入数据库。那么我们就可以从此点入手。
列子:我们注册一个用户,用户名为admin'#
去数据库中查看:发现特殊字符一并存入了数据库。
我们继续观察,发现在pass_change.php中的sql语句中会使用用户名来筛选并修改密码,但是该用户名是直接从数据库中取出的,并没有使用mysql_real_escape_string()函数进行过滤,那么我们就可以发现本次的注入点就在这里。
注入大概过程:
我们可以找到一个用户的用户名,但是我们并不知道它的密码。之后进入注册页面注册新的用户名,在进入密码修改界面修改密码。这就是本次注入的大概流程。
第二步:开始注入
1):假设我们已经知道了一个用户,叫做secure
2):进入注册页面:
注册一个用户名叫:secure'# 的用户
3):我们使用自己注册的用户登录,进入密码修改界面:
修改新密码为:aaaaaa
pass_change.php代码分析:
本次执行的sql代码为:
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username';
这里的用户名为本次登录的用户名,并且直接从数据库中读取,没有进行过滤,当前的用户名为:
secure。
实际执行的代码为:如下
通过sql语句可以看到,我们实际上修改的为secure用户的密码。
4):使用我们修改的密码aaaaaa,来进行登录secure用户。
成功的登入了secure用户。
5):说明我们成功的使用sql注入,利用漏洞拿到了secure用户的密码,本次实验圆满成功。本次实验就是典型的二次注入。