SQLi Labs Lesson24

来源:互联网 发布:js拖拽事件绑定数据 编辑:程序博客网 时间:2024/06/05 17:42

Lesson - 24

POST - second Order Injection *real treat* - Stored Injection


首先进入界面:




点击Forget_your_passoword?,结果如图所示:


那我们先注册一个账号:

username为:test

password为:test


用test登陆,界面如图所示:


在登陆界面尝试了各种单引号双引号等,发现没有卵用。


那么只能读源代码了,找注入点。

$username= $_SESSION["username"];$curr_pass= mysql_real_escape_string($_POST['current_password']);if($pass==$re_pass){    $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";    ......}

发现了这里SQL语句直接用了SESSION存储的username。

而SESSION中存储的username,

$_SESSION["username"] = $login;

$login = sqllogin();function sqllogin(){     $username = mysql_real_escape_string($_POST["login_user"]);   $password = mysql_real_escape_string($_POST["login_password"]);   $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";   echo $sql;   $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');   $row = mysql_fetch_row($res);    //print_r($row) ;   if ($row[1])      {      return $row[1];   }      else      {      return 0;   }}

所以在update那条SQL语句中的username就是数据库中存储的usernname。

本节中的用的转义mysql_read_escape_string并没有改变字符串在数据库中的存储,即:

$item = "Zak's and Derick's Laptop";$escaped_item = mysql_real_escape_string($item);printf ("Escaped string: %s\n", $escaped_item);

的结果虽然是:

Escaped string: Zak\'s and Derick\'s Laptop

但是insert into foo values (...,'$escaped_item',...)后

在数据库中存储的还是:Zak's and Derick's Laptop


综上,我们创建一个用户:

username为:test'#

password为:123456

登陆该用户后,更改该用户密码:

新密码为:hack

点击Reset后,结果如图:


此时,我们进入phpmyadmin查看users表

发现test的密码,由原来的test,变为hack。

而test'#的密码没有改变。

此时回过头来看,更改密码的SQL语句:

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
实际执行的SQL语句为:

UPDATE users SET PASSWORD='hack' where username='test'#' and password='123456'

0 0
原创粉丝点击