SQLi Labs Lesson24

Lesson - 24

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


首先进入界面:

SQLi Labs Lesson24_第1张图片



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


那我们先注册一个账号:

username为:test

password为:test


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

SQLi Labs Lesson24_第2张图片


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


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

$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

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

SQLi Labs Lesson24_第3张图片

新密码为:hack

点击Reset后,结果如图:


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

SQLi Labs Lesson24_第4张图片

发现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'

你可能感兴趣的:(SQLi)