学会如来神掌应该就能打败他了吧

题目地址:http://123.206.31.85:1616/

老师傅说过拿这类到题目要先正常流程走一遍,要先对它有大概的认识

所以既然是游戏我们就得先看看它怎么玩的

.......

别说还挺好玩,不过干回正事

首先整理流程:

结合题目:学会如来神掌应该就能打败他了吧

和开始页面的介绍:不知是谁传出来的,只要学了这如来神掌,就可以打败蒙老魔,还天下一个太平。故事就至此开始了..

可以发现游戏的目标就是学会如来神掌然后打败蒙蒙老魔

目标有了就可以下一步啦,

进入游戏第一步审查元素,是否源码泄露(无发现),和目录扫描

可以发现有头部的js 文件和内容确认初始化属性的php页面

你可能跟我一样看到php就各种尝试,一顿攻击后可以猜测这后面的值是确定游戏流程的,start开始,map确定,再试下可能存在的页面时发现给我们跳转到了这个123.206.31.85:1616/wulin.php

是不是和我一样脸上扬起了笑容,有输入框而且是判断flag的,不过还是开心太早,一顿操作后都没任何反应(可能是我太菜没能攻击成功),审查元素也没任何有用的信息

还是老老实实玩吧,确定属性后我们能做的就是练功和赚钱,

到这没线索了,那就回到一开始的js文件出发

script.js是eval(function)加密过的

网上找解密源码后可以得到(https://www.cnblogs.com/zs-note/p/3895500.html)

可以发现的确只要打了boss就会出flag,那就往上依次找到key→ca→mingwen→temp→temp_name→"user"

从getCookie(temp_name)入手:

可以发现这个就是返回cookie的,通过burp抓包后发现,这人物的状态就是靠cookie保存的,那么我们只要能解密这cookie不就可以伪造cookie了,新目标get!

接下来是decodeURIComponent(temp),这js内置函数对URI解码

解码后传到decode_create(temp),审计代码:

new Base64();创建一个Base64对象,也就是一开始得到js文件的base64.js

decode传进来的temp

再挨个得到ASCII后按位异或i,

接着把得到的数-((i % 10) + 2),

最后在转回字符。

ok我们把代码拉下来把cookie传进去看看能得到什么

O:5:"human":10:{s:8:"xueliang";i:988;s:5:"neili";i:882;s:5:"lidao";i:70;s:6:"dingli";i:72;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";}

得到一串序列化字符串,看到这些拼音,脸上露出了微妙的微笑

虽然看到flag但是是空的所以MD5(key)必然没值,还是得打boss拿

那么马上属性拉满,然后再倒过来走一遍这些流程加密就完事啦

ok倒过来看上面解密的步骤就是:

encode_create(temp):

new Base64();创建一个Base64对象,也就是一开始得到js文件的base64.js

把得到的数-((i % 10) + 2),

再挨个得到ASCII后按位异或i,

转回字符

encode传进来的temp

接下来是encodeURIComponent(temp)

就ok啦

编写代码:

先把base64.js的代码copy过来

出题人还是挺善良的给了encode,但他竟然在这挖坑,害我在这看好久,差点就自己重写了,好险没这本事...

对比可以发现encode一开始是做了_utf8_encode的,而decode这一段是注释掉的(太过分了)所以把这句删掉接着

最后

完成

完整代码

<script>
	function Base64() {
 
	// private property
	_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 
	// public method for encoding
	this.encode = function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
		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;
	}
 
	// public method for decoding
	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;
	}
 
	// private method for UTF-8 encoding
	_utf8_encode = function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {
				utftext += String.fromCharCode(c);
			} else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			} else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
		return utftext;
	}
 
	// private method for UTF-8 decoding
	_utf8_decode = function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
		while ( i < utftext.length ) {
			c = utftext.charCodeAt(i);
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			} else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			} else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return string;
	}
}
function getCookie(cname) {
    var name = cname + "=";
    var ca = "user=UTw7PCxqe3FjcC42OThOjWtSUFYwbm99amlzbG0wI3MeHxwcZ1liZxQMWEFDXl8EdUUOCAgCd016B34WUlFWWTVoATEAB3R5P3Z2CmYgPTY5Pj90FSUUF2QfL2ZnYnYhCRMTGRQPQCcHKFIvEShXUlYCGQMbDQ4FXEcXREo%2FBTzBxKbu6fbrB%2BH%2Bps3nsLrP6dCs0LgR8fj1%2F%2B6y3%2B%2FapJ3XnJnkjNPf0NnRjpPD7pjzzfaMiJDcxt%2FXkP%2FB%2BI2C5vTqgUE%3D".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 encode_create(temp) {
    var base = new Base64();
    var result = temp;
    var result3 = "";
    for (i = 0; i < result.length; i++) {
        var num = result[i].charCodeAt();
        num = num + ((i % 10) + 2);
        num = num ^ i;     
        result3 += String.fromCharCode(num)
    }
    result3 = base.encode(result3);
    return result3
}
#密文解密
var temp = getCookie("user");
temp1 = decodeURIComponent(temp);
var mingwen = decode_create(temp1);
console.log(mingwen);

#明文加密
var temp2 = encode_create('O:5:"human":10:{s:8:"xueliang";i:9999999;s:5:"neili";i:9999999;s:5:"lidao";i:9999999;s:6:"dingli";i:9999999;s:7:"waigong";i:9999999;s:7:"neigong";i:9999999;s:7:"jingyan";i:9999999;s:6:"yelian";i:9999999;s:5:"money";i:9999999;s:4:"flag";s:1:"0";}');
var miwen = encodeURIComponent(temp2);
console.log(miwen);




</script>

全部99999后会发现

那不行,因为不知道属性上限是多少,那就改钱把,因为商店的书籍金额都比较大所有应该不会有太大问题

金额全部99999,你可能发现了这样每做一次操作就得改一次包岂不是很麻烦

别忘了还有个练功和赚钱,都是通过传进来的值在这基础上增加的,练功放弃了,那就走赚钱吧

好了到这基本完成了,买完商店的书籍学了如来神掌后去打boss,打赢后会弹窗出flag,不过提示我们不知道真假

这时别忘了一开始还有个彩蛋页面来验证flag的,输入后会发现有限制,直接右键检查去掉输入框的长度限制

回车

-----------------------------------------------------------------我是分割线--------------------------------------------------------------

看完了觉得不错就点个赞或者评论下吧,感谢!!!

如果本文哪里有误随时可以提出了,收到会尽快更正的

发布了1 篇原创文章 · 获赞 1 · 访问量 69

猜你喜欢

转载自blog.csdn.net/qq_42016346/article/details/103961379