DVWA——JavaScript

low:

进入靶场后点击Submit提交,发现phrase错误

根据提示我们输入success

提示又说token不对

查看源码:

<?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;
?>

发现phrase表示我们输入的内容,然后计算输入的token值写入token,但是为啥写入success也报token错误?
这时利用bp抓包

把这里的ChangeMe改为success

发现我们输入的两次token值一样,猜测这个 token不是后台生成的,而是前台生成的。
打开控制台分别输入md5(rot13(“ChangeMe”)) ,md5(rot13(“success”))查看

发现我们之前输入的success时,他的token并没有变,我们尝试随便输入抓包查看token值
当我们输入hpc,他的token值依然为ChangeMe的token值

原来前台生成的 token和是用 md5(rot13(“ChangeMe”)) ,但是和后台生产的token值不一样,后台希望的token值是success的及md5(rot13(“success”))
修改token值,成功!

medium: 

源码:

源代码: <?php $page[ 'body' ] .= <<<EOF 
<script src="/vulnerabilities/javascript/source/medium.js"></script> EOF;
 ?>

继续跟进

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")}

中级和低级的形式一样,都是求success的token值,查看源代码,发现引入了一个js来创建token
js代码中:**do_something(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及将XX+phrase+XX翻转倒过来即可。
XXsuccessXX -------> XXsseccusXX

bp抓包

成功!

high:

源码:

<?php
$page[ 'body' ] .= <<<EOF
<script src="/vulnerabilities/javascript/source/high.js"></script>
EOF;
?>

对其进行解密(JS解密网址) 

function do_something(e) {
    for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n];
    return t
}
function token_part_3(t, y = "ZZ") {
    document.getElementById("token").value = sha256(document.getElementById("token").value + y)
}
function token_part_2(e = "YY") {
    document.getElementById("token").value = sha256(e + document.getElementById("token").value)
}
function token_part_1(a, b) {
    document.getElementById("token").value = do_something(document.getElementById("phrase").value)
}
document.getElementById("phrase").value = "";
setTimeout(function() {
    token_part_2("XX")
}, 300);
document.getElementById("send").addEventListener("click", token_part_3);
token_part_1("ABCD", 44);

分析:js中用来3个函数来计算token分别为:
**token_part_1()**取phrase值并进行字符串翻转处理;
**token_part_2()**传入参数字符串’YY’和token值拼接并调用sha256
**token_part_3()**将token值和字符串’ZZ’拼接并调用sha256()加密,从而得到最终的token;

1.首先将phrase 的值清空document.getElementById(“phrase”).value = “”;
2.由于setTimeout函数有300毫秒延时,所以先执行了token_part_1(“ABCD”, 44)
3.在执行2.然后再执行了 token_part_2(“XX”)
4.token_part_3被添加在提交按钮的click事件上,也就是点提交会触发执行最后执行。

在输入框输入 success 后,再到控制台输入token_part_1(“ABCD”, 44)和token_part_2(“XX
”)这两个函数,最后点击按钮执行token_part_3()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值