NSSCTF-web-wp
几道web基础题目wp
[SWPUCTF 2021 新生赛]easyupload2.0
几个常用的姿势试过了,PHP,Php行不通,最后改成phtml,成功上传
最后蚁剑,成功连接
【复盘】查看upload.php
|
|
发现用正则表达过滤了php.hta/ini 同时,php3,php5,pht,phtml,phps都是php可运行的文件扩展名
[SWPUCTF 2021 新生赛]easyupload3.0
看赛题标签,提示了.htaccess,果断png+.htaccess组合
[NISACTF 2022]babyupload
F12发现有目录,进行访问后下载得到upload源码,进行代码审计
|
|
可知,若上传的文件中包含“.”,则会返回Bad filename!,那我们上传一个没有后缀的文件
|
|
上传后生成一个uuid,并将uuid和文件名存入数据库中,并返回文件的uuid。再通过/file/uuid
访问文件,通过查询数据库得到对应文件名,在文件名前拼接uploads/
后读取该路径下上传的文件。
绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
当上传的文件名为 /flag ,上传后通过uuid访问文件后,查询到的文件名是 /flag ,那么进行路径拼接时,uploads/ 将被删除,读取到的就是根目录下的 flag 文件。
[NISACTF 2022]bingdundun~
题目提示可以上传压缩包,关于phar://伪协议,ChatGPT给出了这样的
Phar:// 是 PHP 中的一个伪协议,用于访问 Phar (PHP Archive)文件,Phar 是一种类似于 Zip 的文件格式,用于将多个 PHP 文件打包成一个文件,并可以像一个普通的 PHP 文件一样使用。
主要是用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进行进阶的phar反序列化攻击
用法就是把一句话木马压缩成zip格式,shell.php -> shell.zip,然后再上传到服务器(后续通过前端页面上传也没有问题,通常服务器不会限制上传 zip 文件),再访问:?filename=phar://…/shell.zip/shell.php
原文链接:https://blog.csdn.net/YangYubo091699/article/details/127351065
所以,上传a.zip(a.php一句话木马),
根据首页给的提示,构造payload
|
|
随后在蚁剑连接,并在根目录发现了flag
[SWPUCTF 2021 新生赛]jicao
php代码审计
分析代码可知,需要用get方法传进一个json,以及通过post方法传入一个id 构造数据包如下:
回显得到flag
[SWPUCTF 2021 新生赛]easy_md5
进行代码审计,要求name和password的值不同,同时要求两者的md相同,然而进行判断是用的是"==“符号,这是php的弱类型比较 法一:可以使用带0e开头的数字串进行参数传递,因为PHP会将0e开头的数字转化为0,故此时md5值相等,二来能够给变量的值不相等。 法二:可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null
(另:若遇到===
这样的强类型比较,方法一就失效了,方法二仍然有效,或者还可以使用软件fastcoll进行md5碰撞,生成两个字符串使得他们的md5值相同)
另:0e开头的数字
s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020 240610708 0e462097431906509019562988736854 314282422
使用bp发包,得到flag
[SWPUCTF 2021 新生赛]Do_you_know_http
根据页面反馈信息,以及题目描述提示,进行抓包修改user-agent并添加xff,在返回信息中,得到location
访问a.php
再次发包,发现新站点
访问后得到flag
[SWPUCTF 2021 新生赛]babyrce
根据题目提示推测,应该跟cookie有关 抓包修改cookie的值,发包后发现新站点:
|
|
从代码层面来看,屏蔽了空格( ),所以要采取手段来绕过对空格的屏蔽,如果传入的url值不包含空格,则通过函数 **$a = shell_exec($ip);**进行远程rce
在过滤了空格的系统中,以cat flag.txt为例,系统不允许我们输入空格或输入后被过滤。
${IFS}
可使用${IFS}代替空格。
cat${IFS}flag.txt
cat$IFS$1flag.txt
cat${IFS}$1flag.txt
先查看根目录,发现疑似文件 随后使用tac或cat读取文件,得到flag
[第五空间 2021]WebFTP
F12发现用户名为admin,尝试爆破弱口令,可惜没爆破出来,扫描网站后台,发现有.git文件,使用githacker进行扒取,这里复习一下githacker的用法,功能上是比githack要强大的。
进入到Githacker文件夹执行__init__.py
格式如下:
|
|
扒取到的相关文件会输出到该目录下result文件夹中,查看readme.md文档,发现初始账号和密码
进去之后,好像没啥卵用,phpinfo.php文件在目录var/www/html中,但发现无法在ftp里面直接打开。
直接访问http://1.14.71.254:28306/.phpinfo.php
就可以了
我觉得倒是做了许多无用功,复盘时返现直接dirsearch返回的结果中除了.git,也包含了README.md文件以及phpinfo.php都可以直接访问,在phpinfo页面搜索flag直接出。
[SWPUCTF 2021 新生赛]include
进入环境,提示传入一个文件,此外并没有发现什么有效信息,dirsearch扫描后台目录,也没啥有效信息,尝试php伪协议
构造payload进行get传参:http://1.14.71.254:28956/?file=flag
发现有include_once函数
include_once():在脚本执行期间包含并运行指定文件。该函数和include 函数类似,两者唯一的区别是 使用该函数的时候,php会加检查指定文件是否已经被包含过,如果是,则不会再被包含。
于是利用伪协议构造,得到经过base64编码的flag
|
|
至于为什么要使用base64进行编码输出
常见的php伪协议
1)file:// 访问本地文件系统
2)http:// 访问HTTP(S)网址
3)ftp:// 访问FTP(S)URL
4)php:// 访问各个输出输入流
5)zlib:// 处理压缩流
6)data:// 读取数据
7)glob:// 查找匹配的文件路径模式
8)phar:// PHP归档
9)rar:// RAR数据压缩
至于为什么要使用base64编码,ChatGPT给出了这样的回答:
为了将目标文件内容以文本形式传输给攻击者,攻击者通常会将目标文件内容进行编码,例如使用Base64编码。这是因为HTTP协议只能传输文本数据,对于二进制数据,如图片、音频和视频等,需要进行编码才能在HTTP请求和响应中传输。
在这种情况下,攻击者可以将目标文件内容进行Base64编码,然后将编码后的结果作为HTTP请求或响应的一部分,从而实现传输。在接收到响应后,攻击者可以将编码后的结果解码,从而获得原始的二进制数据,即目标文件的内容。
(我们读取的是flag.php,而并非.txt文件)
引用一下头秃的bug师傅在CSDN的笔记:
过滤器的分类(及常见过滤器):
string filter(字符过滤器) string.rot13 (对字符串执行 ROT13 转换) 例:php://filter/string.rot13/resource=flag.php string.toupper (转大写) 例:php://filter/string.toupper/resource=flag.php string.tolower (转小写) string.strip_tags (去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果) 例:php://filter/string.strip_tags/resource=flag.php conversion filter (转换过滤器) convert.base64-encode & convert.base64-decode (base64加密 base64解密) 例:php://filter/convert.base64-encode/resource=flag.php convert.quoted-printable-encode & convert.quoted-printable-decode(在字符串后加=0A,及恢复) compression filter(压缩过滤) zlib.deflate & zlib.inflate(压缩 解压) 例:php://filter/zlib.deflate/resource=flag.php php://filter/zlib.inflate/resource=flag.php bzip2.compress & bzip2.decompress(zip 压缩 解压) encryption filter(加密过滤器)
摘自:https://blog.csdn.net/L2329794714/article/details/121288668
[SWPUCTF 2021 新生赛]easyrce
灰常简单的rce,
在phpinfo中未发现flag,随后构造:
|
|
|
|
得到flag
[SWPUCTF 2021 新生赛]ez_unserialize
没啥有效信息,扫描一下后台,发现
进入c145s.php,得到源代码
经典php反序列化,ChatGPT讲的很明确了
- 禁用错误报告。
error_reporting(0);
可以禁用 PHP 的错误报告,以确保攻击者无法通过错误信息来了解代码的运行情况。- 显示
cl45s.php
的源代码。show_source("cl45s.php");
用于将cl45s.php
的源代码显示在页面上,这可以帮助攻击者更好地了解代码的运行情况和漏洞点。- 定义
wllm
类。这个类具有两个公共属性$admin
和$passwd
,分别用于存储用户名和密码。类中定义了两个方法,一个是构造函数__construct()
,用于初始化$admin
和$passwd
的值;另一个是析构函数__destruct()
,当对象被销毁时执行。- 处理传入的参数。
$p = $_GET['p'];
用于获取 URL 参数中名为p
的值。- 反序列化。
unserialize($p);
将传入的参数$p
进行反序列化处理,即将字符串转换为 PHP 对象。- 调用析构函数。由于在反序列化时会调用对象的构造函数,因此在对象被销毁时会自动调用析构函数
__destruct()
。在析构函数中,如果$admin
的值为"admin"
,$passwd
的值为"ctf"
,则会包含一个名为flag.php
的文件,并将其中的$flag
变量输出到页面上。否则,会将$admin
和$passwd
的值输出到页面上,并输出一条提示信息。
传入以下参数得到flag
|
|
[复习php反序列化]
什么是反序列化漏洞
当程序在进行反序列化时,会自动调用一些函数,例如__wakeup(),__destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。
PHP魔术方法
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,利用魔术方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。 问题就出现在重载过程中,执行了相关代码。
以下是一些常见的php魔术方法:
|
|