攻防世界题解
PHP2
题目信息:进入网站后,显示Can you anthenticate to this website?
其他没有发现异常
实际上,这个网站包含了index.phps且可以打开,其中存在源码泄露
phps即为 PHP Source。
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。
HTTP/1.1 200 OK
Date: Sun, 03 Jul 2022 02:29:44 GMT
Server: Apache/2.4.25 (Debian)
Last-Modified: Wed, 12 Sep 2018 01:54:42 GMT
ETag: "f5-575a2dfb6bc80"
Accept-Ranges: bytes
Content-Length: 245
Connection: close
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
-
顺便提一下Etag
Etag的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
回到正文,进行代码审计可以发现它需要传入一个id值,不能===admin,但urldecode()后会得到admin,尝试如下:
- http://111.200.241.244:53051/?id=admin 得到not allowed!,证明判断有效
- http://111.200.241.244:53051/?id=admi%6E 还是not allowed! 发现浏览器首先进行了自动的urldecode
- http://111.200.241.244:53051/?id=admi%256E 得到flag
这里涉及到url编码的方式:把字符会编码成”%”加上他们的ascii的十六进制
%25其实就是%的url编码,%246E是经过了两次解码,一是浏览器自动解码得到%6E,之后是服务器解码得到了n
Web_python_template_injection
初步分析:进入网页后,显示python template injection
服务器信息为:Werkzeug/0.15.5 Python/2.7.12
了解python模板
from string import Template
def test_example():
template = Template("$who like $what")
d = {'who':"he", "what":"running"}
template_new = template.substitute(d)
print(template_new)
该代码输出:he like running
Werkzeug
Werkzeug是Python的WSGI规范的实用函数库,它是Flask的web框架底层库
改天再做,得先理解模板注入,WP里面最高赞的写的很详细,抽时间再看https://adworld.xctf.org.cn/media/uploads/writeup/223cf817-bddd-4314-ac8b-9da0ffc69a634502.pdf