如果要说11-20和1-10有什么不同的,我觉得最大的不同就是1-10都是GET型注入,而从11开始便是以POST注入为主以及其它几种注入点(referer、cookie等等)为辅了。
Less-11
考点:POST型注入、字符型注入(单引号)、联合注入
判断为单引号闭合
用与GET型的联合注入相同的方法。
这个数据表的列只有两个与之前的三个有点不同
随便在哪个点注入即可,利用之前讲过的查库、查表、查列、查字段。
Less-12
考点:POST型注入、字符型注入(双引号+小括号)、联合注入
用双引号测出错误,看到应该是双引号和小括号的闭合,我们构造闭合再注释之前的闭合。
成功了,老方法,用order by 判断列数,用联合注入查库、查表、查列、查字段。
后面的操作和之前的一样。
Less-13
考点:报错注入、POST型注入、字符型注入(单引号+小括号)
可以看到,是使用的单引号加小括号闭合数据的,但是正确的输入没有回显,尝试使用报错注入,
有回显,我们利用这个查库、查表、查列、查字段。
查表时因为有多个表,如果没有用group_concat()我们需要用limit 限制数量查询。
Less-14
考点:报错注入、POST型注入、字符型注入(双引号)
用双引号把报错信息回显出来,我们看到应该是双引号闭合,测试一下报错注入能不能用
好吧,正常使用,那就和上一题的解法思路一模一样了。
Less-15
考点:布尔盲注、POST型注入、字符型注入(单引号)
看看源码,正确和错误的sql语句回显的图片不同,而mysql_error()被注释了,所以这里无法使用报错注入,我们能利用到的就是盲注,因为正确和错误的回显不同,所以我们使用布尔盲注。
可以看到sql语句是用单引号闭合的,
果然,回显不同。我们使用之前做过的布尔盲注的方法,跑burp或者写脚本,也可以手注,还有一种方法就是跑sqlmap。我演示手注查库,
先用Length()确定库的大致长度
确定了库的长度为8,我们就查库的ASCII码,从第一位到第八位查出来,
先用大于小于号确定大体范围,再用等于号判断是否等于,
所以ASCII码115为字符s,再查一个,
经过测试得到ASCII码为101对应的字符为e,以此类推,我们的库就可以查出,表、列、字段也可如此。
Less-16
考点:布尔盲注、POST型注入、字符型注入(双引号+小括号)
除了闭合与上一题不同,其解法和上一题一模一样,就不细说了。
Less-17
考点:POST型注入、报错注入、字符型注入(单引号)、代码审计
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
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
$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>";
}
}
?>
这个题目盲做很难受,所以我们在这里需要分析源代码,源代码我们挑几个点看就好了,get_magic_quotes_gpc()函数是为后面会出现的宽字节注入做铺垫的,我们可以看到uname参数被传入了check_input()函数中做了检验,当然passwd,并没有,如果想从uname下手很麻烦
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
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
相比于uname,我们的passwd就是一个没有限制的变量,我们对它下手,而且根据代码审计我们发现报错注入应该是可以使用的,
if (mysql_error())
{
echo '<font color= "#FFFF00" font size = 3 >';
print_r(mysql_error());
echo "</br></br>";
echo "</font>";
}
可以看到,在passwd注入成功,我们就可以用查表查列查字段执行了。但是你们可以在uname试一下,肯定不可能成功。
Less-18
考点:User-Agent注入、报错注入、巧用闭合
看过源码,发现passwd和uname这波都被过滤的很严重,所以基本不能使用了,
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
但是有个东西很关键,
$uagent = $_SERVER['HTTP_USER_AGENT'];
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
print_r(mysql_error());
这三行代码,很关键,第一行uagent没有限制,我们可以通过在http头部控制User-Agent控制HTTP_USER_AGENT这个全局变量。
第二行把uagen传入到数据库中去,而且第三行开启了报错,所以我们可以通过利用报错注入对User-Agent大胆的注入使其实现报错注入,但是因为限制了三个参数,后面两个我们管不着,所以我们想办法让第一个参数自然闭合,怎么做呢?看下面我的payload就会明白了。
然后就实现了报错注入,后面的查表、查列、查字段就不演示了。
Less-19
考点:referer注入、字符型注入、报错注入
$uagent = $_SERVER['HTTP_REFERER'];
$IP = $_SERVER['REMOTE_ADDR'];
全局变量HTTP_REFERER来自referer字段,我们只需要改变http请求的referer值即可控制uagent变量,则又回到了上一题的方法了,与上一题的解法也只是大同小异罢了。
注意看我注入点在哪,后面的操作还是一样,简单的查表、查列、查字段。
Less-20
考点:cookie注入、联合注入、字符型注入
这个cookie的删除就提示我们了,他把账号和密码存在cookie中,我们可以尝试修改cookie的值来达到注入的目的,先看看cookie的值,
cookie果然有,所以我们在这里修改cookie的值,修改完后刷新一下界面即可执行cookie值。
单引号闭合,
有账号密码的回显,猜测多半是联合注入了。
中间省略了用order by查列数量,自行操作,后面的就是常规的查库、查表、查列、查字段。