SQL注入
一.http header 注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL inject漏洞。
1.首先打开pikachu,点开http header 点一下提示,登录
2.打开burp suite,右击抓取到的get请求,发送到Repeater
3.打开Repeater,把User-Agent的信息修改为单引号,右边的Response会报错,说明存在着一个SQL注入!
4.将User-Agent后的'替换成构造的payload进行测试
1' or updatexml(1, concat( 0x7e,version()) ,0) or '
还有一种方法是cookie测试,获取到cookie后到数据库拼接进行相关的操作,也有可能会产生SQL注入漏洞的。
首先要先把之前在User-Agent输入的payload删掉,然后在cookie的用户名admin后面加入单引号,运行后可以看到显示报错,接下来在cookie用户名中输入1' and updatexml(1, concat( 0x7e,version()) ,0)#,可以看到报错显示数据库版本信息。
二.盲注
在有些情况下,后台使用了错误信息屏蔽方法(比如@)屏蔽了报错,此时无法在根据报错信息来进行注入的判断,这种情况下的注入,称为"盲注"。根据表现形式的不同,盲注又分为based Boolean和based time两种类型。
1.based on boolean
基于真假的盲注主要特征
没有报错信息
不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断
kobe' and 1=2#
只能通过 真 或者 假 来获取数据,所以手工盲注是很麻烦的。
先在数据库shell中输入payload查询ASCII码或者长度的判断
select ascii(substr(database(),1,1));
select length(database());
知道长度后,在pikachu靶场中输入payload,获取到了用户信息,判断数据库由哪些字母组成
kobe' and ascii(substr(database(),1,1))>7#
kobe' and ascii(substr(database(),1,1))=112#
不断重复,然后取得数据库名。
还有一种方法是更改database()函数来获取用户信息
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>7#
2.based on time
基于boolean的盲注在页面上还可以看到0 or 1的回显,而基于时间的注入就什么都看不到了,我们通过特定的输入,判断后台执行的时间,从而确定注入点,比如用 sleep() 函数
在pikachu靶场中,打开web开发者找到web控制台,点开网络。输入kobe' and sleep(5)# 会看到页面暂停了5秒,说明了存在着一个基于time盲注的SQL注入。
接下来我们先构造一个payload
kobe' and if((substr(database(), 1, 1))='p', sleep(5), null)#
这个payload 的含义是当前数据库如果第一个字母是p就5秒才会返回执行结果,否则立即返回。
当然我们也可以像真假注入是一样的了,替换 database()
三.宽字节注入
在宽字节中,单引号会被转义为斜杠"",这样会无法构造一个SQL语句。可以通过在单引号前面加" %df ",来让单引号逃过转义。通过burp suite抓包,发送到Repeater,输入payload到name中.我们构造kobe%df' or 1=1#
四.表(列)名的暴力破解
之前我们通过 information_schema 去获取的信息,很多时候我们没有权限去读取里面内容,也可能是别的数据库,没有 information_schema
常用的方法就是用暴力破解的方式去获得表名和列名
提交这个kobe' and exists(select * from aa)# 会得到提示
遍历我们字典中的表名,把拦截的数据包发到 BurpSuite 中的Intruder中暴力破解 表名即可
表名不存在时,会提示 doesn't exist,我们匹配这句话
这时候就爆破出一个表名了——users
同理爆破列名的时候输入kobe' and exists(select aa from users)#
五.SQL漏洞防范
1.代码层面
对输入进行严格的转义和过滤
使用预处理和参数化(Parameterized)
2.网路层面
通过WAF启用防范SQL Inject注入策略(或类似防护系统)
云端防护(360网站卫士,阿里云盾)
六.sqlmap工具
将解压好的sqlmap文件夹放到python文件夹下面。