XEE相关
一、简介
https://www.cnblogs.com/xhds/p/12327732.html
XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
二、绕过技巧
编码绕过:iconv - f utf-8 -t utf-16 1.xml > 2.xml 绕过waf
-
关键字过滤
1.绕过SYSTEM的过滤:PUBLIC+随机字符串 约等于 SYSTEM
2.绕过远程dtd过滤:先写到dtd文件,在提交dtd,文件名改成.d就行
-
其他绕过:空格
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
解:intval函数是取整数操作,不仅可以处理十进制,还可以是八进制和科学计数法(php5有效,php7无效)传入1e5
intval(1e5) = 1 (非数字开始后面的全部丢弃)
intval(1e5+1)=100001(+1之后intval就当作科学计数法处理了)
练习2:一个值的md5 等于这个值
解:md5(0exxxx)==0exxxx 脚本爆破
练习3:不是回文序列,但是正序和逆序取整之后的值相等
- num=numpositive说明需要传一个整数,但是正则中又加入了小数点:利用浮点数精度绕过
- 回文绕过:100.0010,小数点最后加0
- 最终payload
练习4:一个数的md5的md5等于本身
解:爆破得到结果 0e1138100474满足要求
二、hash长度扩展攻击
https://www.cnblogs.com/pcat/p/5478509.html。一般题目是这样的:
准备了一个密文(secret)和一些数据(“admin”)构造成一个字符串,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名。hash_admin)密文长度是已知量。
让攻击者可以提交数据(username)以及哈希值(hash_user),虽然攻击者不知道密文(secret)
服务器把提交的数据(username)跟密文(secret)拼接,判断哈希后是否等于提交的哈希值(hash_user)
-
解题工具: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”
- $$可变变量
- parse_str(): 把查询字符串解析到变量中,如果没array 参数,则该函数设置的变量将覆盖已存在的同名变量。
练习1:parse_str
解:首先要求使用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
解:模板渲染
- file_get_contents函数读取template数组中tp对应的value,tp的通过get方式获得,只需要用extract函数覆盖template的值,就可以利用tp参数控制对应的value值:var[template][tp1]=template.php
?var[template][tp1]=aaa
等同于输入了$template=array('tp1'=>'aaa');
全部覆盖了template
- 实现变量覆盖后,访问一下路径看到template.php源码,这里file_get_content读取到的并不是直接显示,而是被template.php写入到了某个地方。
后续可以用file_get_content读取我们输入的data流,然后被写入。file_get_contents触发phar。
- phar八股文,生成.phar文件
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个随机数。
解决:
-
php_mt_seed工具,可以根据随机数恢复种子(两种模式:多个随机数限制范围/单个随机数不限制范围)
(需要用第一个生成出的随机数去猜种子)
-
不需要爆破:https://www.anquanke.com/post/id/196831
(适用于种子定时更新且第一个随机数不知道的情况)
五、远程代码执行(有点复杂,没跟上)
无参数RCE:gem-love.com/ctf/530.html
正则要求:最里面的括号里不能有参数
六、create_function、disable_function
略
Python相关
一、Flask框架的Debug模式
https://baijiahao.baidu.com/s?id=1675623348653265301&wfr=spider&for=pc
有一个PIN码,固定的。访问一个会报错的页面,点击下图红色箭头那里。
输入PIN码就可以得到python的console。
这个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相关
一、类型污染
练习1:first和second不相等,但是加上salt后sha1的值相同
解:字符串的“0”(first)和数字0(second),加上一个字符串“0”(salt)
但这样是不对的,因为数字没有length,改用数组 ["0"]
二、原型链污染
补充知识
1. 文件读取的绕过
https://www.cnblogs.com/zaqzzz/p/10288162.html
空格: ${IFS} $IFS $IFS$9 , < <> %09
-
关键字(eg. 绕过php过滤) :
ph\p ph‘’p p[h]p p{a..z}p
变量拼接(a=test.ph;b=p;cat $a$b)
通配符(ph? 或 ph*)
-
内联执行(将反引号内命令的输出作为输入执行)
cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat index.php;cat flag.php
base64编码 : base64( "cat test.php")=Y2F0IHRlc3QucGhw
- 读取文件的替代指令:cat more less fmt nl short rev