1 基础知识
JavaScript
一种常用于页面代码中,用来实现动态效果的脚本语言。由于JS是存储在客户端,所以过分依赖JS代码逻辑,容易被攻击者获取代码后,进行数据伪造。
2.Low
<?php $page[ 'body' ] .= <<<EOF <script> function rot13(inp) { return inp.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}); } function generate_token() { var phrase = document.getElementById("phrase").value; document.getElementById("token").value = md5(rot13(phrase)); } generate_token(); </script> EOF; ?>
2.1 渗透测试
说提交success就能成功?试一下,结果说错误!
检查页面源代码,发现token的值由md5(rot13(phrase))决定的
通过console 控制台直接拿到token值
token:38581812b435834ebf84ebcc2c6424d6
接下来直接post请求提交,即可成功
token=38581812b435834ebf84ebcc2c6424d6&phrase=success&send=Submit
3.medium
核心代码
<?php
$page[ 'body' ] .= '<script
src="' . DVWA_WEB_PAGE_TO_ROOT . 'vulnerabilities/javascript/source/ medium.js">
</script>';
?>
我们继续跟进查看medium.js
function do_something(e) {
for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n];
return t
}
setTimeout(function () {
do_elsesomething("XX")
}, 300);
function do_elsesomething(e) {
document.getElementById("token").value = do_something(e + document.getElementById("phrase").value + "XX")
}
do_elsesomething(e): 将一个字符串翻转,就是倒放。
setTimeout(function(){do_elsesomething(“XX”)},300): 每300毫秒执行一次do_elsesomething(“XX”)
do_elsesomething(e): 调用do_something(e)函数来设置token值,其中e=XX+phrase+XX
总体含义:该函数通过将phrase进行字符串拼接,即XX+phrase+XX,最后将该值反转设置为token。
在输入框输入success,再在控制台输入do_elsesomething(“XX”)执行,提交即可。
4.high
<?php
$page[ 'body' ] .= '
<script src="' . DVWA_WEB_PAGE_TO_ROOT . 'vulnerabilities/javascript/source/high.js">
</script>';
?>
跟进查看high.js,这里的代码明显被加密混淆了,我们可以使用在线解码工具
找个JS解密网站,解密: http://deobfuscatejavascript.com/#
分析:上面SHA加密代码不看,直接看最下方的具体加密过程:
同理将js修改后写入到自定义页面中,SHA加密相关代码要完整拷贝:
......省略加密代码
function do_something(e) {
for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n];
return t
}
var token;
function token_part_3(t, y = "ZZ") {
token = sha256(token + y);
alert('token_part_3_final-----'+token);
}
function token_part_2(e) {
token = sha256(e + token);
alert('token_part_2-----'+token);
}
function token_part_1(a, b) {
token= do_something("success");
alert('token_part_1-----'+token);
}
token_part_1("ABCD", 44);//模拟加载时执行
token_part_2("XX")//模拟过300ms,其实就是页面渲染完成后执行
token_part_3()//模拟提交时执行
就在打开的解码工具直接修改之前的代码将上面的代码写入然后点击按钮
打开页面,获取token:
最后在输入框输入success,再在控制台输入token_part_1(“ABCD”,44)和token_part_2(“XX”),最后提交即可。
5 Impossible
测试效果:
源码分析:直接一锅端,随便你怎么输入,我都不管,反正你就是不安全,我不相信你!!!
if ( $_COOKIE[ 'security' ] == "impossible" ) {
$page[ 'body' ] = <<<EOF
<div class="body_padded">
<h1>Vulnerability: JavaScript Attacks</h1>
<div class="vulnerable_code_area">
<p>
You can never trust anything that comes from the user or prevent them from messing with it and so there is no impossible level.
</p>
EOF;
}
6 总结
前端所有输入都不能相信!
但是呢?后台要全部验证,代码逻辑太多,写不过来!所以,可被利用的漏洞还是很多的!