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'