一、通配符注入
like
测试注入
username=admin&password=admin 提示username or password error
输入单引号闭合测试
这里用or防止admin字段不存在数据库中,如果admin不存在用and连接admin不为真,username的逻辑还是没绕过,用or就算我们前面输入的字段不存在也可以让1=1来绕过username判断逻辑
username=admin' or 1=1%23&password=admin 提示password error
通配符
利用常见列名猜测:password、passwd
这里用and连接判断password是否以a开头后面跟一个或多个字符,提示username or password error就说明我们的password不是以a为开头的,利用burp的intruder模块进行爆破
username=admin' and password like 'a%'%23&password=1 提示username or password error说明密码不是a开头
当返回结果全是username or password error时,就证明数据已经全部都猜出来了
最后跑出密码是iphone 登陆就能拿到flag
brup 里面在a的位置打上标记,这里选择添加列表,
接着选择小写字母和数字,这里只选择小写是因为mysql是不区别大小写的:
regex
和like的过程是一样的,直接方上payload,然后burp进行爆破就可以
username=admin' and password regexp '^iphone'%23&password=1
猜测正确返回 password error
猜测错误返回 username or password error
二、strcmp函数注入
字母和字母之间比较时,就是比较ASCII码的值,就是让前面的减去后的,结果是负数就是-1,这里的b和c的ASCII码值都比a大,所以这里返回的都是-1:
我们把顺序改一下,这样前面的比后面的大,返回的结果就是1,两个相等之间想减的话就是0:
payload
猜测密码第一位的ASCII码值是否为1
username=admin' and strcmp(ascii(substr(password,1,1)),1)%23&password=1
当猜测正确时,服务端返回的是错误的结果(username or password error),而猜测错误时,返回的是正确的结果(password error)和我们上面的相反,因为strcmp在比较完两个值相等时返回的是0,那么1 and 0结果就为零,返回结果就是(username or password error),猜错的时候strcmp返回的是-1或1,1 and 1 和 1 and -1 返回的结果都是1,服务器返回的结果就是(password error),我们看下面的例子就可以明白,当我们猜错时候数据库返回数据,猜对时不返回数据:
拿到结果后进行一步ascii转换,就可以拿到ascii字符
三、总结
有的题,不一定是去获取数据库里面的数据,而是绕过登陆,比如万能密码之类
like regexp 不能区分大小写
strcmp
使用的是ascii值,就避免了大小写的问题,相对于刚才的通配符,结果更准确