BurpSuite和浏览器关系的一些理解
今天写CTF题目的时候看到这样一篇文章: https://blog.csdn.net/qq_46091464/article/details/106665358
博主通过Burpsuite抓包用伪协议发送url命令执行的时候,发现返回400错误。(400 Bad Request 是由于明显的客户端错误(例如,格式错误的请求语法,太大的大小,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求。)
博主代码:?file=data://text/plain,<?php phpinfo();?>
后来才知道是因为<?php phpinfo();?>中有特殊字符不能被服务器所理解从而导致了错误(因为我们一般的业务中,url都是先经过了编码然后才发送给服务器,然后服务器再自己转换回正常代码进行执行。)
因为burpsuite是位于浏览器和服务器中间的一个东西 所以如果在burpsuite进行操作的话,那么这里的url不会被自主编码,而是直接以原代码的方式发送给服务器,导致服务器对于一些特殊字符理解不了,比如<>;()这种
所以这里正确的解决办法是在burpsuite中将<?php phpinfo();?>进行URL编码,这样对面服务器就理解是什么字符了,就可以执行命令了
对于data伪协议的话,其实不一定要变成base64的格式,用上面这个方法进行URL编码就行。 但是万一URL编码绕过不行的话,就老老实实用base64编码
代码如下: ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
然后这里的话我们又看到有特殊字符+那么我们还是要将其URL编码来进行绕过。
还有两种方法可以绕过base64出现+号的导致服务器识别不了的问题: ①不写后面的?> 因为PHP里面其实不需要写后面的 前面的;号就已经说明结束了。如果没有;号就必须写?>作为结束。
②添加空格改变base64编码。
对于URL编码的必要性的补充: 现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办。 比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。
如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码 URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。
|