Pre:
同事在用XSSCon来测试xss漏洞,然后发现run不起来,然后我帮它debug了一下,顺手提了pr.
我稍微瞄了一下这个工具的xss scanner的代码,发现精简得很,所以看一看它源码.
检测效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| __ ______ ____ ____ \ \/ / ___/ ___| / ___|___ _ __ \ /\___ \___ \| | / _ \| '_ \ {v0.5 Final} / \ ___) |__) | |__| (_) | | | | https://github.com/menkrep1337/XSSCon /_/\_\____/____/ \____\___/|_| |_| <<<<<<< HEAD
[16:20:31] [INFO] Starting XSSCon... *************** [16:20:31] [INFO] Checking connection to: http://testphp.vulnweb.com [16:20:32] [INFO] Connection estabilished 200 [16:20:32] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query [16:20:32] [INFO] Collecting form input key..... [16:20:32] [INFO] Form key name: searchFor value: <script>console.log(5000/3000)</script> [16:20:32] [INFO] Form key name: goButton value: <Submit Confirm> [16:20:32] [INFO] Sending payload (POST) method... [16:20:33] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query [16:20:33] [CRITICAL] Post data: {'searchFor': '<script>console.log(5000/3000)</script>', 'goButton': 'goButton'} *************** [16:20:34] [INFO] Checking connection to: http://testphp.vulnweb.com/index.php [16:20:36] [INFO] Connection estabilished 200 [16:20:36] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query [16:20:36] [INFO] Collecting form input key..... [16:20:36] [INFO] Form key name: searchFor value: <script>alert(6000/3000)</script> [16:20:36] [INFO] Form key name: goButton value: <Submit Confirm> [16:20:36] [INFO] Sending payload (POST) method... [16:20:37] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query [16:20:37] [CRITICAL] Post data: {'searchFor': '<script>alert(6000/3000)</script>', 'goButton': 'goButton'} *************** [16:20:39] [INFO] Checking connection to: http://testphp.vulnweb.com/categories.php [16:20:40] [INFO] Connection estabilished 200 [16:20:40] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query [16:20:40] [INFO] Collecting form input key..... [16:20:40] [INFO] Form key name: searchFor value: <script>alert(6000/3000)</script> [16:20:40] [INFO] Form key name: goButton value: <Submit Confirm> [16:20:40] [INFO] Sending payload (POST) method... [16:20:41] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query [16:20:41] [CRITICAL] Post data: {'searchFor': '<script>alert(6000/3000)</script>', 'goButton': 'goButton'} [16:20:41] [WARNING] Found link with query: cat=1 Maybe a vuln XSS point [16:20:41] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script> [16:20:41] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E [16:20:42] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E [16:20:42] [WARNING] Found link with query: cat=2 Maybe a vuln XSS point [16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script> [16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E [16:20:42] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E [16:20:42] [WARNING] Found link with query: cat=3 Maybe a vuln XSS point [16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script> [16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E [16:20:43] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E [16:20:43] [WARNING] Found link with query: cat=4 Maybe a vuln XSS point [16:20:43] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script> [16:20:43] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E [16:20:43] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E ***************
|
省略了很多,通过输出可以大致了解一下他的流程。。
搭建靶机环境:
phpstudy + xss练习平台代码. 方便调试…
1
| http://192.168.0.107/xss/level2.php
|
主要流程:
命令行参数解析:
都是常规的一些参数,所以就略过.
可以看到里面含cralwer参数,可见是个带有爬虫功能的主动发包的scanner.
检查可用性:
在开始探测之前,会检查一下该url的"连通性".
作者本意是通过返回包的状态码status_code
,认为大于400就是"连接失败".
这里用connection
应该是不准确的.
有任一状态码都认为是服务器有回复,即是连通的.
连通性有问题的话,应该是请求超时,服务器无响应.
所以,这里我觉得是检查该探测行为(xss检测)情况下,这个url的可用性.
xss检测的话,只要能正常访问页面,状态码是2xx或者3xx都是ok的.
而检测服务器报错的时候,状态码是5xx也是ok的。
检测服务器报错的时候常常是构造异常的url(数据包),服务器无法正常处理,然后报错,可能会把报错信息输出在页面上.
这种情况下,状态码一般都是5xx
(大于400),那么是这个时候服务器是有响应的,有处理你的请求的,不能认为是连通性有问题.
不同检测方式,判定url的可用性应该是不一样的。
三类请求的检测:
get_method:
形式:get方法提交的键值对参数
例如:xxx.com/index.php?id=1
判断方式是看xss payload有没在返回包的源码中,简单粗暴但容易误报.
这里面还有个细节就是发了两次请求包.
为什么要发两次请求包呢?要多发个urlencode
后的包呢?
因为有些特殊的字符要urlencode
之后,服务器才能正常正确的处理.例如&
等.
之前在写api的时候,试过token
值里面带了&
这个符号后,api程序不能正常解析,认为这是个不合法的token
.
**HTTP协议中参数组件的传输是key=value
键值对的形式,如果要传输多个参数就需要用&
符号对键值对进行分隔。**例如?name1=value1&name2=$value2,这样在服务器收到这种字符串的时候,会用“&”分隔出每一个参数,然后再用“=”来分隔出参数值。
如果我的参数值中就包含=
或者&
这样的特殊子字符的时候,该怎么办。比如说name1=value1
,其中value1的值是va&lu=e1
,那么在传输过程中就会变成name1=va&lu=e1
。用户传输的本意是只有一个键值对,但是服务器端会解析成两个键值对,这样就自然的产生了歧义。
**URL编码只是简单的在特殊字符的各个字节(16进制)前加上%
即可。**例如,我们对上述会产生歧义的字符进行编码后的结果:name1=va%26lu%3D
,这样服务器会把紧跟在%
后的字节当成普通的字节,不会把它当成各个参数或键值对的分隔符。
form表单通过get方法提交.
其中可以学到的点就是
构造请求包的思路:
post_method:
form表单通过post方法提交.
这个大体跟get_method_form
相似.略过
总结:
这个xss scanner代码量很少,只能算个简单的黑盒静态检测Xss的scanner,容易误报.
-
代码虽少,但是可以通过这个工具简单的了解到一个黑盒静态检测的xss scanner是怎么写的,也是非常不错的哈哈哈.
-
不同检测方式,判定url的可用性应该是不一样的。
-
有任一状态码都认为是服务器有回复,即是连通的.连通性有问题的话,应该是请求超时,服务器无响应.
-
**HTTP协议中参数组件的传输是key=value
键值对的形式,如果要传输多个参数就需要用&
符号对键值对进行分隔。**如果参数值中就包含=
或者&
这样的特殊子字符的时候,**用户传输的本意是只有一个键值对,但是服务器端会解析成两个键值对,这样就自然的产生了歧义。**这个时候就要用URL编码,URL编码只是简单的在特殊字符的各个字节(16进制)前加上%
即可。
含注释的代码在https://github.com/jerrychan807/XSSCon/tree/comment
Refs: