sql注入初步

本文是这段时间来学习sql注入的一个小结。

前言

本文是这段时间来学习sql注入的一个小结,想分几篇文章来讨论下sql注入的一些内容和在ctf比赛中的具体实例。

常规sql注入的几个分类

联合注入

联合注入是一种有回显的注入,主要的利用手法是通过union查询结果覆盖合法查询结果以得到数据库中更多内容,常见于搜索框中。类似于 xxx.xxx?id=1’ union select 1,2,3– ,而页面回显包含1,2,3。

报错注入

报错注入也是一种常见的注入方式,主要是利用数据库的某些机制人为地制造出错误条件,使查询结果出现在错误信息中。个人比较常用的主要有两种方式,一种是通过xpath语法错误报错,例如 id=1’ and extractvalue(concat(0x7e,database(),0x7e))–,另外一种是通过几何函数报错(只测试过mysql)id=1’ and ploygon(id)

延时注入

延时注入主要是在页面无回显或者报错联合以及布尔盲注失效的时候考虑的一种做法,主要有两种思路,一种是构造布尔条件利用数据库特有函数延时,另外一种是通过耗时较长的运算来模拟延时。例如mysql中的benchmark函数。
例如 id=1’ or if(mid(database(),1,1)=’a’,sleep(5),0)–

布尔注入

布尔注入主要是页面回显受限的时候的一种做法,构造布尔条件,但条件不同时页面回显不同,这说明存在布尔注入
例如 id=1’ or if(mid(database(),1,1)=’a’,1,0)–
如果条件成立页面返回id=1的查询结果,但不成立时页面无回显

堆叠注入

堆叠注入我碰到的不是特别多,印象比较深刻的就是强网杯的那道注入题(经验不足,看到select被过滤了还在傻傻地想办法绕过)。主要的问题是允许执行多条sql语句的,例如php的pdo。那么可以将sql截断后附上想要执行的sql语句,在无回显的情况下考虑update或者insert,有回显的情况下考虑使用procedure执行编码后的sql语句来绕过过滤
例如 id=1’;show tables;
回显tables的信息

宽字节注入

二次注入

注入中几个常见的场景

where 后存在注入

多见于查询框,登录表单中,后台语句类似于这样
select * from users where username='$_GET['username']'
闭合username后即可利用

insert和update中存在注入

举insert为例
insert into users('username','password')values("$_POST['username']","$_POST['password']");
闭合""和)后构造语句即可利用

limit后存在注入

select * from users where id=1 limit 1,$_GET['max']
补齐limit后对应数量,然后可以采用produre analyse()来进行延时注入或者报错注入

常见的一些思路

常见的一些保护手段

对于数字型参数的保护是用intval()函数转为数字,对于字符型参数的保护主要使用addslash()函数,但这种保护需要注意mysql的连接的编码和网页的编码需要保持一致,不然可能产生宽字节注入的危险。碰到waf的时候根据情况处理即可,碰到常规注入都行不通的情况考虑堆叠注入。

测试的思路

首先上来拿到题目最好先拿源码泄露脚本扫描一遍,看看能不能拿到源码。右键看下源码,能看的东西都看一遍。然后寻找可控制的参数,做一下fuzz。首先考虑闭合语句,再优先考虑报错注入和联合注入,都不可行的情况下考虑盲注,最后可以尝试宽字节注入和堆叠注入。主要常见的闭合语句就是‘和‘),’))几种,都试一试。语句正确的情况下考虑and和or被过滤的情况,建议替换为||和&&。对于空格的过滤可以考虑替换为/**/和%a0。如果存在关键词的黑名单,考虑随机大小写关键词和双写绕过,也可以考虑一些特殊的符号比如1e0,Emoj等等来截断。

小结

这是本人的第一篇博客,写的比较水,后续打算写几篇最近做题的wp或者更具体的一些分析,比如报错注入的一些点就可以好好讲讲。近期还是优先准备4,6级考试。