WriteUp1

Posted by Distiny on October 5, 2022

攻防世界题解

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