sql注入一
一.判断数字型和字符型sql注入
在表单数据后添加 and 1=1/1=2/3-1如果无论1=1或1=2都能正常登录,说明是字符型sql注入,否则是数字型sql注入。


以上两个1=1和1=2都能正常登录,说明是字符型sql注入
二.查找注点
在字符型注入表单数据前面或后面加上’ ,” ,’) ,”) 查看引号的包裹方式

三.判断查询的列数
因为union合并的两个查询语句列数必须相同,所以必须查询系统表的列数,然后使注入的sql语句列数与系统表的列数相同。先从大到小以二分法试,直到试对。
查询的函数为group by h和 order by (推荐用group by,更不容易被防火墙拦截)




以上一直查询到3列才显示结果,说明查询的列数是3列。
注意:第一个查询结果无效,比如select 1,2,3 只会显示2,3结果。
四.使注入命令的执行结果能正常显示
在注入后系统只会显示union查询的前一个查询的结果,所以要使前一个查询无效,让前一个查询的结果为空,一般把前一个查询的id设为一个不存在的id(0,-1等)。

只执行了union前一个id=’1’的查询的结果,而不后面的查询结果。

让id=-1,使前一个查询无效,让前一个查询的结果为空,就能正常显示注入命令的执行结果。
五.union注入的更多用法
1.union中常用的数据库,表,列
- 数据库:information_schema
- 表:tables(在information_schema数据库中)
- 表:columns(在information_schema数据库中)
- 列:table_schema(当前数据库名,在tables和columns中都有)
- 列:table_name(表名,在tables和columns中都有)
- 列:column_name(列名,在columns中)
2.group_concat函数一次性查询多个数据

使用group_concat函数后可一次性查询多个数据

多列数据用组合查询

3.查询列名例子

知道列名后,便可查询列的数据了

以上是字符型sql的union注入的用法,数字型sql注入的用法与字符型sql注入的用法相同,只需把id后的引号或括号去掉即可。
六.extractvalue注入
适用场景
- 无显示结果:SQL语句查询结果无法直接显示在页面上。此时页面可能只返回“操作成功”或“失败”,但不显示数据库中的具体数据
- 报错显示:目标网站的数据库错误信息(如MySQL错误)会直接显示在网页上。这是EXTRACTVALUE注入成功的关键前提。(同时满足1和2才适用)
基本格式
1 | ?id=-1' union select 1,2,extractvalue(1,concat(0x7e,要查询的内容))--+ |
例子:
- 查询表名

- 查询列名

substring函数
系统默认只显示32个字符,是使用substring函数后可以精准查询每段字符
基本格式
1 | select substring(字符串,起始位置(从1开始计数),长度) |
使用前

使用后

七.updatexml注入
应用场景
1.与extractvalue注入相同
2. 在extractvalue被过滤或拦截时,可用updatexml注入
基本格式
?id=-1’ union select 1,2,updatexml(1,concat(0x7e,要查询的内容),3)–+
updatexml与extractvalue不同的是,后者只需两个参数(把第一个无效查询结果占掉,第二个输入想要的查询结果),而updatexml需三个参数(两个无效的查询结果把想要的查询结果包裹起来)
例子:

八.floor报错注入
适用条件与extractvalue注入和updatexml注入相同,三个注入哪个被过滤或拦截,就用另外两个注入方法。
实例

1.查询少量数据时可以用group_concat函数查询多个数据,当查询的数据量较大时,使用concat加limit0,1 一组一组查询
2.rand()里面一般0或4,作用是随机生成0-1之间的小数
3.concat_ws(‘分隔符’,’字符串1’,’字符串2’,’字符串3…’)作用是将多个字符串用分隔符连接起来
4.floor()作用是取整,将小数部分去掉,只保留整数部分
九.布尔盲注
适用场景
网站没有报错信息和查询结果,只返回成功或失败的信息,无法直接查询数据库中的数据。
实例



以上页面只返回真或假的信息,只能一个一个试,试出所需信息每个字符对应的asc码值,再用chr()函数转换为字符。
substr函数可以精确查询每个字符
利用二分法和python脚本可以快速查询出所需信息
十.时间盲注
适用场景与布尔盲注相同
所用函数
- sleep()函数
sleep()函数的作用是使查询语句执行时间延迟,延迟时间可以设置为1秒以上,根据延迟时间的长短,判断查询语句是否成功。
- if()函数
if(条件,条件为true时返回值,条件为false时返回值)
实例


由页面延迟了3秒,推断出字符的asc码值为115,即s
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Hello World!
