SQL注入
单引号报错,经典报错注入
123’/1/user/‘ 注出user
尝试直接xp_cmdshell命令执行
发现存在过滤,打算fuzz查看过滤哪些参数
AES 加解密
抓包发现参数加密
查看js,很基础的加解密
- 选择字符集:使用 UTF-8 编码。
- 设置密钥:设置密钥为
1234567890abcdef
。 - 设置初始化向量(IV):设置 IV 为
0987654321fedcba
(反转字符串abcdef1234567890
)。 - 选择加密模式:使用 CBC 模式。
- 选择填充方式:使用 PKCS7 填充。
- 选择编码方式:使用 Base64 编码。
https://github.com/outlaws-bai/Galaxy bp爆破热加载加解密
过滤参数
我这里GPT直接拉了一个脚本
1 | import requests |
过滤参数:
1 | or |
1‘/1/@@version/‘
1’/1/db_name()/‘ 拿到数据库 lab_db
123’/1/user/‘ 注出user dbo
获取列名
注了半天本菜狗实在不能直接注出username和password
琢磨了一个有点邪教的方式(结果他跟我说靶场写错了,不小心禁用了OR )
首先考虑这里是登录点,无非就是去数据库对应的表对比账户密码的值,这里用户名存在注入,说明直接将参数拼接在查询语句了。
模拟一下
select * from 用户表 where username =’用户名’’’ AND password =’密码’
那就直接拼接让username=username,那么只要密码正确即登录成功。
不存在的列名也会通过报错出现提示
如:’+use123+’ 这里可以猜测爆破用户名的列 我就不写过程了 用户名的列为username
获取密码
'+username+'
这里直接爆破密码,密码正确即登录成功,有几个密码就有几个用户名
获取用户名
这里拿到两个密码,逆推用户名
回到这里,两种方式,一种直接爆破用户名,一种报错注出用户名,毕竟是SQL注入靶场,用报错来。
select * from 用户表 where username =’用户名’ AND password =’密码’
'+username/1+'
这里与获取密码的原理一样,给了正确的密码,数据库去寻找对应密码的账户去除1,字符串不能运算,报错出用户名
test/Aa123456
密码为1的用户名使用'+username/1+'
却直接登录成功了
说明密码为1的用户名是一个数值,想制造报错就修改类型
‘+(username+’qwer’)/1+’
用户名为1
文件上传
利用NTFS流::$DATA绕过
在Windows中如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
例如:phpinfo.php::$DATAWindows会自动去掉末尾的::$DATA变成phpinfo.php
注:这是NTFS文件系统具有的特性,FAT32文件系统无法利用
http://113.45.189.205:8085/uploads/076w.php
上传.user.ini文件绕过
http://113.45.189.205:8085/uploads/index.php
文件包含
头像上传处先上传一个php马的png
http://113.45.189.205:8085/include.php?page=about.php
简单构造
http://113.45.189.205:8085/include.php?page=../uploads/076w.png
提权
上马有个360哦,自己想办法搞个免杀马吧,我就不提供了
读取mssql账号密码登录
查看版本
就用mssql bypass 360那篇文章就好了,我就直接展示了