前言:
MYSQL 注入中首先要明确当前注入点权限,高权限注入时有更多的
攻击手法,有的能直接进行 getshell 操作。其中也会遇到很多阻碍,相关
防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需
要了解其中的手法和原理,这样才是一个合格的安全工作者。
limt使用
使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。
LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是 0(而不是 1):
为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为为 -1:
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击放大图片](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
information_schema数据库表
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。
是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。
是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。 KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。
高权限注入及低权限注入
root在MYSQL数据库中属于最高权限,除root之外其他都简称为为普通用户权限
跨库查询介绍
跨库是指由于权限高,root用户不止能够操作自己的数据库,还可以操作普通用户的数据库的行为
举例:
数据库A = 网站A = 数据库用户A 普通用户
数据库B = 网站B = 数据库用户B 普通用户
数据库C = 网站C = 数据库用户C root用户
这里A、B只能操作自己的数据库,而C就可以除了能够操作自己的数据库,还可以操作A、B的数据库(跨库)
在安全测试的过程中,我们可以运用这种思想,通过获取最高权限后对其他关联数据库进行操作
举例:在同个目录下存在网站A和网站B(即在同一个服务器),对网站A进行安全测试没有发现漏洞,网站B存在SQL注入漏洞,我们就可以获取到网站B的数据库内容,如果网站B用户为root用户,我们就间接拿到网站A对应的数据库内容。
跨库查询及应用思路(查询是在sqlilabs网站进行)
information_schema 表特性,记录库名,表名,列名对应表
获取所有数据库名:
http://ctf.tmzo.club/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
获取指定 qqyw 数据库名下的表名信息:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(table_name),3 frominformation_schema.tables where table_schema=‘qqyw’
注意:‘qqyw’不行时,用%27qqyw%27
获取指定 qqyw 下的表名 users 下的列名信息:
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=%27users%27 and table_schema=%27qqyw%27(加上and后面的判断语句是为了保证查出来的字段名是对应表的,多个数据库命名为admin的表可能有多个)
获取指定 qqyw 下的 usersu 数据
union select 1,username,password from qqyw.admin(这是sqlilabs网站进行查询,所在的数据库并不是 qqyw,所以我们需要通过qqyw.users来指定)
文件读写操作(详细介绍)
会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入、分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。
MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。
load_file():读取函数
into outfile 或 into dumpfile :导出函数
C:/phpstudy_pro/Extensions/php/php5.6.9nts/php.inc
读取文件条件
- 数据库条件:SQL注入篇——文件读写注入_admin-r꯭o꯭ot꯭的博客-CSDN博客_sql注入文件读取
- sql注入文件读写 - cAr7n - 博客园 (cnblogs.com)
- php版本条件:magic_quotes_gpc(魔术引号开关)等函数与数据库安全_a3uRa的博客-CSDN博客_magic_quotes_gpc
- 常见写入文件问题:魔术引号开关
magic_quotes_gpc
#魔术引号及常见防护
<?php header("Content-Type: text/html;charset=utf-8");//为了让页面不出现乱码 //当magic_quotes_gpc=On的时候,get_magic_quotes_gpc函数的返回值为1 //当magic_quotes_gpc=Off的时候,get_magic_quotes_gpc函数的返回值为0 if (get_magic_quotes_gpc()) { echo 'magic_quotes_gpc 开启'; } else { echo 'magic_quotes_gpc 未开启'; }
?>
路径获取常见方法
- 报错显示:网站报错的时候会泄漏出自己的路径(扫描工具/手动探测)
- 百度搜索:inurl:edu.cn warning (格式相同,改变inurl内容即可)也可以查到其他网站报错显示
- 遗留文件:调试软件或者平台遗留下来的文件,经典的就是phpinfo.php(扫描工具可以扫到)
- 漏洞报错:知道网站是用什么cms或者框架进行搭建的,用搜索引擎去找到对应的爆路径方式,比如phpcms 爆路径
- 平台配置文件:结合前面的读取文件操作来读取搭建网站平台的配置文件,通过默认路径去尝试找到突破口,但如果更改了默认安装路径,也是很难进行(不怎么常用)
- 爆破:什么信息都没办法获取到,我们运用一些常见固定的可能安装位置生成字典,对目标网站进行爆破
例如:
windows:d:/www/root/xiaodi8/
linux:/var/www/xiaodi8
读取文件
注意点:
- 文件路径不能用" \ " ,但是可以用" \\ " 或 "/ "
- 必须具备前述条件,
- ’ %27 ' 全部代表 ’
- " --+ " 是为了注释 LIMT O,1
?id=-1 union select 1,load_file(%27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\sql-connections\\db-creds.inc%27),3
写入文件
into outfile函数或 into dumpfile :导出函数
此处 ‘x' 可以换成后门语言。
?id=-1 union select 1,'x',3 into outfile %27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\xxx.txt%27 --+
防护办法
if (is_int($id)) { $sql="SELECT* FROM users WHERE id=$id LIMIT O,1";echo $sql; $result=mysql_query($sql); } else { echo 'chi xi gua'; }