DVWA靶场——JavaScript Attacks(前端攻击)

发布时间:2026/7/25 16:21:08
DVWA靶场——JavaScript Attacks(前端攻击) JavaScript Attacks表面上是一个修改短语phrase你输入一段文字比如ChangeMe——点击 Submit——页面显示你的短语已更新但其真正目的在于告诉我们把所有安全逻辑都放在前端 JavaScript 里是多么危险的事情一个正常的 Web 应用修改用户数据时应该由服务器端完成验证浏览器只负责提交和展示low源码分析?php $page[body] . EOF script /* MD5 code from here https://github.com/blueimp/JavaScript-MD5 */ !function(n){use strict;function t(n,t){var r(65535n)(65535t);return(n16)(t16)(r16)16|65535r}function r(n,t){return nt|n32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(tr|~to,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(to|r~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r5]|128r%32,n[14(r6494)]r;var e,i,a,d,h,l1732584193,g-271733879,v-1732584194,m271733878;for(e0;en.length;e16)il,ag,dv,hm,gf(gf(gf(gf(gc(gc(gc(gc(gu(gu(gu(gu(go(go(go(go(g,vo(v,mo(m,lo(l,g,v,m,n[e],7,-680876936),g,v,n[e1],12,-389564586),l,g,n[e2],17,606105819),m,l,n[e3],22,-1044525330),vo(v,mo(m,lo(l,g,v,m,n[e4],7,-176418897),g,v,n[e5],12,1200080426),l,g,n[e6],17,-1473231341),m,l,n[e7],22,-45705983),vo(v,mo(m,lo(l,g,v,m,n[e8],7,1770035416),g,v,n[e9],12,-1958414417),l,g,n[e10],17,-42063),m,l,n[e11],22,-1990404162),vo(v,mo(m,lo(l,g,v,m,n[e12],7,1804603682),g,v,n[e13],12,-40341101),l,g,n[e14],17,-1502002290),m,l,n[e15],22,1236535329),vu(v,mu(m,lu(l,g,v,m,n[e1],5,-165796510),g,v,n[e6],9,-1069501632),l,g,n[e11],14,643717713),m,l,n[e],20,-373897302),vu(v,mu(m,lu(l,g,v,m,n[e5],5,-701558691),g,v,n[e10],9,38016083),l,g,n[e15],14,-660478335),m,l,n[e4],20,-405537848),vu(v,mu(m,lu(l,g,v,m,n[e9],5,568446438),g,v,n[e14],9,-1019803690),l,g,n[e3],14,-187363961),m,l,n[e8],20,1163531501),vu(v,mu(m,lu(l,g,v,m,n[e13],5,-1444681467),g,v,n[e2],9,-51403784),l,g,n[e7],14,1735328473),m,l,n[e12],20,-1926607734),vc(v,mc(m,lc(l,g,v,m,n[e5],4,-378558),g,v,n[e8],11,-2022574463),l,g,n[e11],16,1839030562),m,l,n[e14],23,-35309556),vc(v,mc(m,lc(l,g,v,m,n[e1],4,-1530992060),g,v,n[e4],11,1272893353),l,g,n[e7],16,-155497632),m,l,n[e10],23,-1094730640),vc(v,mc(m,lc(l,g,v,m,n[e13],4,681279174),g,v,n[e],11,-358537222),l,g,n[e3],16,-722521979),m,l,n[e6],23,76029189),vc(v,mc(m,lc(l,g,v,m,n[e9],4,-640364487),g,v,n[e12],11,-421815835),l,g,n[e15],16,530742520),m,l,n[e2],23,-995338651),vf(v,mf(m,lf(l,g,v,m,n[e],6,-198630844),g,v,n[e7],10,1126891415),l,g,n[e14],15,-1416354905),m,l,n[e5],21,-57434055),vf(v,mf(m,lf(l,g,v,m,n[e12],6,1700485571),g,v,n[e3],10,-1894986606),l,g,n[e10],15,-1051523),m,l,n[e1],21,-2054922799),vf(v,mf(m,lf(l,g,v,m,n[e8],6,1873313359),g,v,n[e15],10,-30611744),l,g,n[e6],15,-1560198380),m,l,n[e13],21,1309151649),vf(v,mf(m,lf(l,g,v,m,n[e4],6,-145523070),g,v,n[e11],10,-1120210379),l,g,n[e2],15,718787259),m,l,n[e9],21,-343485551),lt(l,i),gt(g,a),vt(v,d),mt(m,h);return[l,g,v,m]}function a(n){var t,r,e32*n.length;for(t0;te;t8)rString.fromCharCode(n[t5]t%32255);return r}function d(n){var t,r[];for(r[(n.length2)-1]void 0,t0;tr.length;t1)r[t]0;var e8*n.length;for(t0;te;t8)r[t5]|(255n.charCodeAt(t/8))t%32;return r}function h(n){return a(i(d(n),8*n.length))}function l(n,t){var r,e,od(n),u[],c[];for(u[15]c[15]void 0,o.length16(oi(o,8*n.length)),r0;r16;r1)u[r]909522486^o[r],c[r]1549556828^o[r];return ei(u.concat(d(t)),5128*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e;for(r0;rn.length;r1)tn.charCodeAt(r),e0123456789abcdef.charAt(t415)0123456789abcdef.charAt(15t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}functiontypeof definedefine.amd?define(function(){return A}):objecttypeof modulemodule.exports?module.exportsA:n.md5A}(this); function rot13(inp) { return inp.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((cZ?90:122)(cc.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;从页面中获取idphrase的输入框的值用户输入的短语对该值进行 ROT13 编码再对 ROT13 的结果进行 MD5 哈希将最终结果赋值给idtoken的隐藏字段关键点generate_token()在页面加载时立即执行最后一行这意味着Token的值完全由用户输入的phrase决定其核心问题就在于Token的生成算法完全暴露在客户端token MD5(ROT13(phrase))且依赖于用户输入的phrase因此任何用户都可以为自己想要的任何phrase生成一个合法的Token提示我们提交单词 success 即可获胜根据我们刚刚的分析Token 是由md5(rot13(phrase))计算得出的服务器验证的就是这个公式需要提交phrasesuccess和对应的正确Token第一步计算 ROT13success 经过 ROT13 编码 s → f u → h c → p c → p e → r s → f s → f 结果 fhpprff第二步计算 MD5对fhpprff进行 MD5 哈希。使用浏览器开发者工具F12 → Consolemd5(fhpprff)第三步构造请求开发者工具里改变token和phrase的值分别为 value38581812b435834ebf84ebcc2c6424d6 valuesuccess 点击submit提示我们成功了Medium源码分析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) }1.do_something()函数 - 字符串反转输入hello输出olleh2.setTimeout()- 延迟执行等待 300毫秒 后调用do_elsesomething(XX)3.do_elsesomething()- Token生成核心参数e的值是XX获取输入框phrase的值拼接字符串XX phrase XX调用do_something()进行反转将反转后的结果赋给token字段开发者可能认为做了以下加强增加了盐值SaltXX phrase XX看起来像是加了密钥让Token不那么容易被猜中增加了延迟执行setTimeout()让代码不那么直观可能认为这样能阻止自动化脚本改变了算法从MD5改为字符串反转认为换算法能迷惑攻击者实际情况是算法仍然完全暴露在客户端所谓的盐值是硬编码的反转算法是可逆的延迟执行可以用调试器跳过漏洞利用第一步计算正确的Token对于 phrase success: token reverse(XX success XX) reverse(XXsuccessXX) XXsseccusXX第二步构造攻击请求我们依旧直接改变表单元素没毛注入成功了high源码分析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);跟前两个等级差不多依次执行第1步token_part_1()// 反转 phrase token do_something(success) sseccus第2步token_part_2(XX)// 拼接 SHA256 拼接 XX sseccus XXsseccus token sha256(XXsseccus)第3步用户点击Submit →token_part_3()// 获取当前token拼接ZZ再SHA256 拼接 token ZZ sha256(XXsseccus) ZZ token sha256(拼接)最终Tokentext最终Token sha256( sha256(XX reverse(phrase)) ZZ )其问题算法仍然完全在客户端盐值是硬编码的可以手动调用函数可以绕过延迟所以利用漏洞也是同样的流程第一步计算token第二步构造攻击请求impossible你永远不能信任任何来自用户的东西也无法阻止用户篡改它因此不存在不可能级别DVWA靶场的最后一个关卡在屏幕上弹出Success提示的那一刻我知道这段短暂却充实的Web安全探索之旅迎来了尾声。回首这段学习的日日夜夜从最初面对漏洞时的茫然无措到如今能够从容分析代码、构造攻击载荷并提出防御方案其中的每一次突破都离不开许多人的帮助与支持首先我要由衷感谢DVWADamn Vulnerable Web Application项目及其开发者团队。这个由Digininja发起并持续维护的开源项目以其精心设计的漏洞环境和循序渐进的四级难度体系为我这样的Web安全初学者搭建了一座从理论通往实践的金色桥梁。从Low级别将安全逻辑赤裸裸地暴露在客户端到Impossible级别将验证逻辑深植服务器端DVWA不仅是漏洞的陈列馆更是一部活生生的安全思想演进史。正是这个在危险中学习的平台让我深刻理解了永远不要信任用户输入这条Web安全的金科玉律同时我要特别感谢互联网上无数开源的网络安全社区与知识分享者。Burp Suite的官方文档、各大安全论坛中前辈们的实战经验与踩坑记录以及GitHub上数不清的Payload集合与绕过技巧——这些散落在数字世界各处的智慧碎片在我最需要指引的时刻点亮了前路。感谢那些素未谋面却毫不吝啬分享知识的博主与安全从业者是你们的无私筑就了后来者学习的阶梯。我也要感谢这段学习过程中遇到的每一个漏洞本身。SQL注入教会我最危险的往往不是复杂的攻击手法而是一个未被转义的单引号XSS向我证明安全防御不能止步于输入过滤输出编码同样不可或缺而JavaScript Attacks模块则用最简单的方式展示了那个最深刻的道理——所有摆在客户端的安全措施都不过是防君子不防小人的装饰品。感谢这些漏洞以最生动的方式为我上了一堂堂安全之课。我要感谢未来的自己和所有正在学习安全的朋友们。DVWA只是万里长征的第一步真正安全的系统需要在实战中千锤百炼真正的安全工程师需要在攻防对抗中持续成长。我将带着这段学习经历沉淀下的技术、思维与敬畏之心继续在这个充满挑战与魅力的领域前行。愿我们都能用技术让这个世界变得更加安全peace and love