GET和POST型
表单提交:
<?php
if(isset($_GET["firstname"]) && isset($_GET["lastname"]))
{
$firstname = $_GET["firstname"];
$lastname = $_GET["lastname"];
if($firstname == "" or $lastname == "")
{
echo "<font color=\"red\">Please enter both fields...</font>";
}
else
{
echo "Welcome " . htmli($firstname) . " " . htmli($lastname);
}
}
?>
数据过滤:
function htmli($data)
{
switch($_COOKIE["security_level"])
{
case "0" :
$data = no_check($data);
break;
case "1" :
$data = xss_check_1($data);
break;
case "2" :
$data = xss_check_3($data);
break;
default :
$data = no_check($data);
break;
}
return $data;
}
Low:
构造payload: <img src=0 onerror=alert(/hack/)>
直接弹窗了,因为接收表单提交的参数后使用no_check()函数:
function no_check($data)
{
return $data;
}
没有进行任何过滤。
Medium:
构造payload: %3cimg%20src%3d0%20onerror%3dalert(%2fhacker%2f)%3e
这个等级使用了xss_check_1()函数来过滤字符:
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
$input = urldecode($input);
return $input;
}
可见该函数将字符串中的 > 和 < 替换为了HTML实体,然后又对字符串进行urldecode解码,故直接将< >进行urlencode再构造即可。
High:
function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
// '&' (ampersand) becomes '&'
// '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
// "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
// '<' (less than) becomes '<'
// '>' (greater than) becomes '>'
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
可以看到对字符串使用了htmlspecialchars()函数,将危险字符进行转义,并且设置了编码为UTF-8。
暂时我还没想出来byPass的方法,如果解决了后续会更新。
反射Current URL型
防护代码:
switch($_COOKIE["security_level"])
{
case "0" :
// $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
break;
case "1" :
$url = "<script>document.write(document.URL)</script>";
break;
case "2" :
$url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
break;
default :
// $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
break;
}
核心代码:
<div id="main">
<h1>HTML Injection - Reflected (URL)</h1>
<?php echo "<p align=\"left\">Your current URL: <i>" . $url . "</i></p>";?>
</div>
Low:
关于$_SERVER
安全等级为0时是将HTTP请求头中的HOST和URL内容读取过来。
用Burpsuite改包:
具体作用暂时没想到。
Medium:
核心语句:
<script>document.write(document.URL)</script>
构造payload:http://localhost/bwapp/htmli_current_url.php?<h1>heyyy</h1>
这个问题只在IE上出现,火狐和Chrome均没有。
High:
核心语句:
"http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
该等级对于 $_SERVER["REQUEST_URI"] 使用了htmlspecialchars()函数,但是HTTP_POST没有经过处理,依旧可以用Low等级下改包的方法,但我暂时还是不知道有什么作用。
网友评论