2021-09-11-清华大学-奇安信CTF训练营笔记

XEE相关

一、简介

https://www.cnblogs.com/xhds/p/12327732.html

XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

image-20210911164818481.png

二、绕过技巧

  • 编码绕过:iconv - f utf-8 -t utf-16 1.xml > 2.xml 绕过waf

  • 关键字过滤

    1.绕过SYSTEM的过滤:PUBLIC+随机字符串 约等于 SYSTEM

image-20210911101033211.png
2.绕过远程dtd过滤:先写到dtd文件,在提交dtd,文件名改成.d就行
image-20210911101409260.png
  1. 其他绕过:空格


    image-20210911101933603.png

PHP相关

一、md5绕过 (值不一样的,但是md5的值一样)

  • V1:双等号的弱相等:利用0exxx == 0exxxx,md5(string)-> 0exxxxxx

    绕过:https://blog.csdn.net/weixin_45897324/article/details/108961503
    eg. s878926199a;s155964671a;s214587387a;s214587387a

  • V2:三个等号的强相等:利用false===false,md5(array)-> false

    绕过:a[]=xxxx

  • V3:强项等且强制要求a是字符串,md5碰撞

    绕过:https://jianshu.com/p/c9089fd5b1ba

练习1:一个数字小于2020,+1大于2021
image-20210911105021404.png

解:intval函数是取整数操作,不仅可以处理十进制,还可以是八进制和科学计数法(php5有效,php7无效)传入1e5
intval(1e5) = 1 (非数字开始后面的全部丢弃)
intval(1e5+1)=100001(+1之后intval就当作科学计数法处理了)

练习2:一个值的md5 等于这个值

image-20210911105547278.png

解:md5(0exxxx)==0exxxx 脚本爆破

image-20210911105741935.png

练习3:不是回文序列,但是正序和逆序取整之后的值相等

image-20210911111104795.png
  • num=numpositive说明需要传一个整数,但是正则中又加入了小数点:利用浮点数精度绕过
image-20210911111552883.png
  • 回文绕过:100.0010,小数点最后加0
image-20210911111307492.png
  • 最终payload
image-20210911111744849.png

练习4:一个数的md5的md5等于本身

image-20210911111830636.png

解:爆破得到结果 0e1138100474满足要求

image-20210911111925739.png

二、hash长度扩展攻击

https://www.cnblogs.com/pcat/p/5478509.html。一般题目是这样的:

  • 准备了一个密文(secret)和一些数据(“admin”)构造成一个字符串,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名。hash_admin)密文长度是已知量。

  • 让攻击者可以提交数据(username)以及哈希值(hash_user),虽然攻击者不知道密文(secret)

  • 服务器把提交的数据(username)跟密文(secret)拼接,判断哈希后是否等于提交的哈希值(hash_user)

image-20210911112327515.png
  • 解题工具:hashpump(https://github.com/bwall/HashPump)

    参数:hash_admin;“admin”; secret的长度; “ abc”(任意字符串)

    结果:第一行是新的签名,也就是hash_user; 第二行就是username,把\x替换为%后post提交

3e67e8f0c05e1ad68020df30bbc505f5
admin\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\abc

三、变量覆盖

  • extract :$a=“Cat”, 直接覆盖原来的值“Original”
image-20210911113111005.png
  • $$可变变量
image-20210911115301538.png
  • parse_str(): 把查询字符串解析到变量中,如果没array 参数,则该函数设置的变量将覆盖已存在的同名变量。
image-20210911115705441.png

练习1:parse_str

image-20210911135445567.png

解:首先要求使用GET提交id参数,然后parse_str($id)对id参数的数据进行处理,再使用判断$a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)的结果是否为真,为真就返回flag。

只需要找到一个字符串md5后的结果是0e开头后面都是数字的就行,如240610708,s878926199a。之后利用parse_str函数将a[0]赋值为240610708 :GET请求id=a[0]=240610708,这样会将a[0]的值覆盖为240610708

练习2: extract

https://blog.csdn.net/qq_38154820/article/details/113874923

image-20210911113248158.png

解:模板渲染

  • file_get_contents函数读取template数组中tp对应的value,tp的通过get方式获得,只需要用extract函数覆盖template的值,就可以利用tp参数控制对应的value值:var[template][tp1]=template.php
image-20210911113509910.png

?var[template][tp1]=aaa 等同于输入了$template=array('tp1'=>'aaa');全部覆盖了template

  • 实现变量覆盖后,访问一下路径看到template.php源码,这里file_get_content读取到的并不是直接显示,而是被template.php写入到了某个地方。
image-20210911150504944.png

后续可以用file_get_content读取我们输入的data流,然后被写入。file_get_contents触发phar。

  • phar八股文,生成.phar文件
image-20210911114426194.png

echo file_get_contents("php://filter/convert.base64-encode/resource=phar.phar");

  • payload: ?var[template][tp1]=data://text/plain;base64,R0lG....(上面的输出)AAR0JNQg%3D%3D&tp=tp1

四、随机数问题

Mt_rand()伪随机数:种子固定,随机数就固定。

注意php版本,版本不同种子一样的话,随机数也会不一样

问题场景:给出前10个随机数,求出剩下的10个20个随机数。


image-20210911141303774.png

解决:

  • php_mt_seed工具,可以根据随机数恢复种子(两种模式:多个随机数限制范围/单个随机数不限制范围)

    (需要用第一个生成出的随机数去猜种子)

  • 不需要爆破:https://www.anquanke.com/post/id/196831

    (适用于种子定时更新且第一个随机数不知道的情况)

image-20210911143012103.png

五、远程代码执行(有点复杂,没跟上)

无参数RCE:gem-love.com/ctf/530.html

image-20210911143350623.png

正则要求:最里面的括号里不能有参数

image-20210911143438688.png

六、create_function、disable_function

Python相关

一、Flask框架的Debug模式

https://baijiahao.baidu.com/s?id=1675623348653265301&wfr=spider&for=pc

image-20210911153957118.png

有一个PIN码,固定的。访问一个会报错的页面,点击下图红色箭头那里。

image-20210911154037714.png

输入PIN码就可以得到python的console。

image-20210911154122984.png

这个pin码需要知道其他信息才能知道,这些其他信息的获得一般是考察其他漏洞点。我们如果能够伪造这六个值我们就能够生成一个一模一样的PIN码了。debug pin由六个值决定:

  • 用户

  • flask.app

  • Flask

  • flask目录下的一个app.py的绝对路径

  • 当前电脑的MAC地址,为mac地址的十进制表达式

  • 首先尝试读取/etc/machine-id或者 /proc/sys/kernel/random/boot_i中的值,若有就直接返回;假如是在win平台下读取不到上面两个文件,就去获取注册表中SOFTWARE\Microsoft\Cryptography的值,并返回

二、Flask Session

  • 伪造session:先获得key,解密现有的session获得格式,然后加密自己构造的session

https://blog.csdn.net/weixin_42172261/article/details/104454478

  • 结合ssti 模板注入 {{}}

https://www.dazhuanlan.com/mayulove/topics/1196791

JavaScript相关

一、类型污染

image-20210911160521795.png

练习1:first和second不相等,但是加上salt后sha1的值相同

image-20210911160630609.png

解:字符串的“0”(first)和数字0(second),加上一个字符串“0”(salt)

但这样是不对的,因为数字没有length,改用数组 ["0"]

二、原型链污染

image-20210911162140633.png
image-20210911162323781.png
image-20210911162706117.png

补充知识

1. 文件读取的绕过

https://www.cnblogs.com/zaqzzz/p/10288162.html

  • 空格: ${IFS} $IFS $IFS$9 , < <> %09

  • 关键字(eg. 绕过php过滤) :

    1. ph\p ph‘’p p[h]p p{a..z}p

    2. 变量拼接(a=test.ph;b=p;cat $a$b)

    3. 通配符(ph? 或 ph*)

    4. 内联执行(将反引号内命令的输出作为输入执行)

      cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat index.php;cat flag.php

    5. base64编码 : base64( "cat test.php")=Y2F0IHRlc3QucGhw

image-20210911110444622.png
  • 读取文件的替代指令:cat more less fmt nl short rev

4.python暴力破解哈希后六位

image-20210911143105431.png

你可能感兴趣的:(2021-09-11-清华大学-奇安信CTF训练营笔记)