先用御剑扫一下
根据题目名字和扫描结果,我们访问一下网站的首页index.php,并没有什么发现
但这里肯定与php有关,题目在php后面加了个2,想到phps,phps 文件就是 php 的源代码文件
通过访问index.phps,我们得到php的源码
代码审计后发现需要使用get传参给id传入admin,但是这里有urldecode()函数,要求对admin进行解码,所以我们在传入id值前要先对admin进行URL编码,即urlencode()函数
URL编码原理:将每个字母对应转换成16进制,且每个前面加%
我们可以看到URL默认对字母和数字不编码,这里第一次对字母或者数字的编码需要手动编码
按照上述方法,我们先将字母转成16进制,再都加上%得到:%61%64%6d%69%6e
也可以用Python自己写一个转换的脚本(仅针对字母数字)
同样得到:%61%64%6d%69%6e
这里还有一个问题就是,我们在浏览器输入admin时,浏览器本身就会对admin进行一次url解码,所以这里需要对admin进行二次url编码
第二次就可以直接使用在线编码工具了
当然我们也可以根据它的原理自己编码,因为%对应的16进制为25,而url默认对数字不会进行编码,所以只需要将%都换成25,且每个前面再加上%即可。
得到 %2561%2564%256d%2569%256e
使用get传参,传入id=%2561%2564%256d%2569%256e
即URL为http://61.147.171.105:58331/?id=%2561%2564%256d%2569%256e
拿到flag:cyberpeace{b4e9a68866fcac0d51add0b2e70d0600}
其他:
1、我们知道了如何手动URL编码,那么URL的解码呢?
通过观察我们不难看出,对于有%的URL解码:
去掉%,并将%后两位数字视为16进制,转换成对应的ASCII字符。
2、看了wp后,发现这里其实也可以只针对第一个字母来进行,什么意思呢?
对admin编码时,只针对a,将a转换成16进制为61,同理添加上%后为:%61dmin
二次编码,将百分号转换成16进制为25,加上%为:%2561dmin
即URL为:http://61.147.171.105:58331/?id=%2561dmin
解码时只针%后两位数字,%2561dmin 去掉百分号,25换为ASCII字符为%:%61dmin
二次解码,还是先去掉%,61换成ASCII为a:admin
总的来说这里可以将所有字母进行转换,也可以只转换第一个字母
我们只要能成功将admin传给id就可以拿到flag了