打开是一个游戏,大体意思是说要用足够的钱来买武功秘籍,首先想到的是用脚本来快速赚钱,但是赚钱需要五秒,每次只有100两,时间太长不现实。
看别人的题解,这题的思路是JS审计+逆向解密

在wulin.php中发现这个


首先审计script.js

eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[57-9abd-hj-zAB]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 s(t){5 m=t+"=";5 8=9.cookie.n(\';\');o(5 i=0;i<8.d;i++){5 c=8[i].trim();u(c.v(m)==0)p c.substring(m.d,c.d)}p""}7 w(a){5 x=new Base64();5 q=x.decode(a);5 r="";o(i=0;i<q.d;i++){5 b=q[i].charCodeAt();b=b^i;b=b-((i%10)+2);r+=String.fromCharCode(b)}p r}7 ertqwe(){5 y="user";5 a=s(y);a=decodeURIComponent(a);5 z=w(a);5 8=z.n(\';\');5 e="";o(i=0;i<8.d;i++){u(-1<8[i].v("A")){e=8[i+1].n(":")[2]}}e=e.B(\'"\',"").B(\'"\',"");9.write(\'<img id="f-1" g="h/1-1.k">\');j(7(){9.l("f-1").g="h/1-2.k"},1000);j(7(){9.l("f-1").g="h/1-3.k"},2000);j(7(){9.l("f-1").g="h/1-4.k"},3000);j(7(){9.l("f-1").g="h/6.png"},4000);j(7(){alert("你使用如来神掌打败了蒙老魔,但不知道是真身还是假身,提交试一下吧!A{"+md5(e)+"}")},5000)}',[],38,'|||||var||function|ca|document|temp|num||length|key|attack|src|image||setTimeout|jpg|getElementById|name|split|for|return|result|result3|getCookie|cname|if|indexOf|decode_create|base|temp_name|mingwen|flag|replace'.split('|'),0,{}))

去掉eavl()函数后在控制台执行代码
得到代码后格式化

function getCookie(cname) {var name = cname + "=";var ca = document.cookie.split(';');for (var i = 0; i < ca.length; i++) {var c = ca[i].trim();if (c.indexOf(name) == 0) return c.substring(name.length, c.length)}return ""
}function decode_create(temp) {var base = new Base64();var result = base.decode(temp);var result3 = "";for (i = 0; i < result.length; i++) {var num = result[i].charCodeAt();num = num ^ i;num = num - ((i % 10) + 2);result3 += String.fromCharCode(num)}return result3
}function ertqwe() {var temp_name = "user";var temp = getCookie(temp_name);temp = decodeURIComponent(temp);var mingwen = decode_create(temp);var ca = mingwen.split(';');var key = "";for (i = 0; i < ca.length; i++) {if (-1 < ca[i].indexOf("flag")) {key = ca[i + 1].split(":")[2]}}key = key.replace('"', "").replace('"', "");document.write('<img id="attack-1" src="data:image/1-1.jpg">');setTimeout(function () {document.getElementById("attack-1").src = "image/1-2.jpg"}, 1000);setTimeout(function () {document.getElementById("attack-1").src = "image/1-3.jpg"}, 2000);setTimeout(function () {document.getElementById("attack-1").src = "image/1-4.jpg"}, 3000);setTimeout(function () {document.getElementById("attack-1").src = "image/6.png"}, 4000);setTimeout(function () {alert("浣犱娇鐢ㄥ鏉ョ鎺屾墦璐ヤ簡钂欒€侀瓟锛屼絾涓嶇煡閬撴槸鐪熻韩杩樻槸鍋囪韩锛屾彁浜よ瘯涓€涓嬪惂!flag{" + md5(key) + "}")}, 5000)
}

游戏的数据是在cookie中保存的
分别调用函数
getCookie(“user”)
c=decodeURIcomponent(cookie)
decode_create(c )
得到序列化的游戏属性

O:5:"human":10:{s:8:"xueliang";i:911;s:5:"neili";i:947;s:5:"lidao";i:62;s:6:"dingli";i:86;s:7:"waigong";i:0;s:7:"neigong";i:0;s:7:"jingyan";i:0;s:6:"yelian";i:0;s:5:"money";i:0;s:4:"flag";s:1:"0";}

修改money的值(直接修改属性是不行的,会被直接封号)
将修改后的序列加密
这里需要逆向一下加密函数

function encode_create(temp) {var result3 = "";for (i = 0; i < temp.length; i++) {// 将字符转为Unicode编码var num = temp.charCodeAt(i);num = num + ((i % 10) + 2);num = num ^ i;result3 += String.fromCharCode(num);}var base = new Base64();var result1 = base.encode(result3);return result1;
}

注:这里用了别人博客的代码
直接将代码在控制台运行就可以使用函数
k=encode_create(“修改后的字符串”)
cookie=encodeURIcomponent(k)
将cookie改为生成后的值
还没有结束
你会发现修改后页面返回后的cookie并没有改变
原因在base64.js代码里

function Base64() {// private property_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";// public method for encodingthis.encode = function (input) {var output = "";var chr1, chr2, chr3, enc1, enc2, enc3, enc4;var i = 0;input = _utf8_encode(input);while (i < input.length) {chr1 = input.charCodeAt(i++);chr2 = input.charCodeAt(i++);chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)) {enc3 = enc4 = 64;} else if (isNaN(chr3)) {enc4 = 64;}output = output +_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +_keyStr.charAt(enc3) + _keyStr.charAt(enc4);}return output;}

代码中有一个input=_utf8_encode(input)
而在

this.decode = function (input) {var output = "";var chr1, chr2, chr3;var enc1, enc2, enc3, enc4;var i = 0;input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");while (i < input.length) {enc1 = _keyStr.indexOf(input.charAt(i++));enc2 = _keyStr.indexOf(input.charAt(i++));enc3 = _keyStr.indexOf(input.charAt(i++));enc4 = _keyStr.indexOf(input.charAt(i++));chr1 = (enc1 << 2) | (enc2 >> 4);chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);chr3 = ((enc3 & 3) << 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) {output = output + String.fromCharCode(chr2);}if (enc4 != 64) {output = output + String.fromCharCode(chr3);}}//output = _utf8_decode(output);return output;}

这个函数中 output=_utf8_decode(output) 被注释掉了
base64输入和输出的编码不一样,因此我们可以去掉前一个代码或者增加被注释掉的代码
具体的操作为:将要修改的代码复制出来,修改后在控制台执行,这样就会覆盖掉原来的函数
再次执行刚才的加密操作,得到有用的cookie
修改cookie后金钱增加,购买秘籍,得到flag

Bugku-江湖魔头(web)相关推荐

  1. BugKu CTF Web

    BugKu CTF Web 滑稽 计算器 GET POST Simple_SSTI_1 矛盾 eval 变量1 Simple_SSTI_2 alert 你必须让他停下 方法一 方法二 方法三 网站被黑 ...

  2. Bugku:web 江湖魔头

    ​这道题就看题目就非常有意思了,我们的目标就是打败江湖魔头. 提示也是令人想入非非,看来打败魔王之后就能得到flag了吧. 进入之后点击进入江湖,这时候的源代码还没有什么提示. 进入之后, 这时候就有 ...

  3. bugku练习Web 1(web2--成绩单)

    参考:https://www.cnblogs.com/RenoStudio/p/10355180.html https://www.cnblogs.com/cnnnnnn/p/11064062.htm ...

  4. Bugku:web矛盾

    继续web学习,打开网址链接. 最开心的事情莫过于直接看到PHP代码因为不用去抓? 可以看到意思是num不是numeric并且num需要等于1的时候才会展示出flag,这就是题目矛盾的来源. 所以要怎 ...

  5. Bugku,Web:各种绕过哟

    uname 不等于 passwd,sha1 值不能一样,id 就是 margin php_sha1 碰撞,其中 php_sha1() 函数不能处理数组,可以用数组绕过 得到 flag

  6. Bugku / CTF / WEB 输入密码查看flag

    根据URL提示可知本题用爆破 本题要求的密码是5位数 修改google的代理服务器,再用burpsuite抓包,步骤如下: 1.将burpsuite打开后 点proxy >> interc ...

  7. Bugku CTF web 你必须让他停下来 解题思路

    启动场景发现网页一直在刷新,按F12查看源代码可以在某一次网页刷新时看到flag但是复制不了 这时你可以禁用浏览器JavaScript页面特效,再次启动场景并进行手动刷新,按F12,在某一次刷新时就可 ...

  8. Bugku CTF web source

    打开题目 打开链接,查看源码其中的flag是错误的但是看到了tig,于是联想到git泄露 Tig 是一个 git 资源库浏览器 也可以进行目录扫描,我使用的是dirsearch可以扫描成功 dirse ...

  9. Bugku,Web:程序员本地网站

    让服务器获取请求端的本地 IP 地址,添加 XFF 头部 获取 flag

  10. 【bugku】web game1 来盖楼啊

    ps萌新第一次写wp如有不足请大佬指点 打开网址 是一个盖楼游戏 老规矩先玩几把 Fn+F12 查看源码 发现相关信息  xmlhttp.open 括号里面提交的值等于正确 那么打开score.php ...

最新文章

  1. 工程大小优化之图片资源
  2. Codeforces Beta Round #2 B. The least round way
  3. c语言规定 程序中用到的变量一定要,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  4. boost——windows下VS2013update5编译boost库
  5. 怎样查看JVM的默认收集器
  6. 用MVC来实现javaScript的时间效果
  7. php textarea换行
  8. 传感器的定义、构成、分类
  9. .NetCore源码阅读笔记系列之Security (四) Authentication AddJwtBearer
  10. jdbc心得-2-数据库与java相结合
  11. smith圆图重要性_smith圆图的理解
  12. 问题:import org.springframework.security.authentication.encoding.Md5PasswordEncoder;spring5.已移除
  13. 来自网页的消息服务器不能创建对象,电脑IE浏览器提示“Automation服务器不能创建对象”怎么办...
  14. java开发基础(面试必备)
  15. 基于强化学习工具箱的自适应巡航控制系统
  16. Q/GDW376.1主站与采集终端通信协议测试方法
  17. 面试官问:浏览器输入 URL 回车之后发生了什么?
  18. Try to increase the 20000ms adb execution timeout represented by 'uiautomator2ServerInstallTimeout'
  19. Mac开发必备工具(一)—— Homebrew
  20. 2021年中式烹调师(初级)考试题及中式烹调师(初级)作业模拟考试

热门文章

  1. 简单的查条码小程序Demo (输入商品条码查询商品信息)
  2. pytorch自定义函数实现自动梯度
  3. C语言经典笔试题(一)
  4. OSM数据转ArcGIS可用格式
  5. 4个封神的电脑软件,颠覆你对白嫖的认知,干货奉上
  6. python基础教学(超详细)
  7. 【原创】用思维导图写测试点的几点说明
  8. 招聘旺季来临,爽朗的小伙伴们,你们准备好了吗?
  9. SAR Speckle reduction--Charles Deledalle - Software--Open Source
  10. 【Word技巧】打印部分内容或者隐藏不打印的内容,如何操作?