Xman资格选拔赛-web
variacover
这道题一打开就是源码,主要就是根据源码构造url。其中,它接收的参数只有b,但源码中要获取flag的关键参数是a[0]。parse_str()函数的作用是把查询字符串解析到变量中,于是我们可以通过将a[0]嵌入b的传参中,然后由这个函数再将a[0]提取出来,解析出a[0]后,还需要满足其值是MD5加密后与MD5('QNKCDZO’)的值相等,但加密前的字符串不相等,因为QNKCDZO的MD5匹配很常见,在网上就可以搜到,或者也自己写个脚本暴破,之所以会存在这种情况,是因为PHP的弱性质,字符串QNKCDZO经MD5加密后的密文是0e830400451993494058024219903391,而php在做hash比较时,会将0e\d+这类字符串解析成科学计数法,因此若两个不同的字符串经MD5加密后的密文为0e最后构造如下payload:?b=a[0]=240610708\d+类型则比较相等,同样的0e\d+类密文和0比较也是相等的。故

urldecode
一开始的提示很明显,首先尝试get方式传一个me的参数,页面会返回下一条提示:

于是更改传参的值为XMAN后,页面返回great,查看源码可得提示:

于是立马想到的是url的二次加密,将XMAN做两次url加密可得

之所以会想到二次加密是因为,urldecode()是url解密函数,字符串XMAN不可能做解密,那么最大的可能就是将二次加密的参数传到服务端,经服务端做了一次解密后,绕过检测,获取信息url信息XMAN,于是paylaod如下:

unserialize
从题目信息可以知道这是一道php反序列化的题,一开始还是跟着题目的提示做,随便传入一个参数code,得到提示flag.php,于是访问这个php页面,得到提示help.php,接着访问help.php得到最终的提示:

看这段代码的意思是读入filename文件的内容然后返回,filename的初始值是’error.log’,于是想到可以改成flag.php,试了下,最后是在./index.php页面,将php反序列化的代码作为code的值上传,最后的payload如下:

PHP
这道题一打开就是一片空白,很明显是源码泄露了,随手一试就爆出源码了:

这里有点浏览器的兼容问题,firefox上显示的源码不全,但是chorm上可以显示完整的源码:
<?php
$a=0;
$b=0;
$c=0;
if (isset($_GET['aaa']))
{
$aaa = $_GET['aaa'];
$aaa=="1"?die("Emmm..."):NULL;
switch ($aaa)
{
case 0:
case 1:
$a=1;
break;
}
}
$bbb=(array)json_decode(@$_GET['bbb']);
if(is_array($bbb)){
is_numeric(@$bbb["ccc"])?die("Emmm..."):NULL;
if(@$bbb["ccc"]){
($bbb["ccc"]>2017)?$b=1:NULL;
}
if(is_array(@$bbb["ddd"])){
if(count($bbb["ddd"])!==2 OR !is_array($bbb["ddd"][0])) die("Emmm...");
$eee = array_search("XMAN", $bbb["ddd"]);
$eee===false?die("Emmm..."):NULL;
foreach($bbb["ddd"] as $key=>$val){
$val==="XMAN"?die("Emmm..."):NULL;
}
$c=1;
}
}
if($a && $b && $c){
include "flag.php";
echo $flag;
}?>
于是根据源码的意思,需要上传两个参数aaa和bbb,最后拿到flag的条件是满足代码中的一些规则,使得a,b,c三个变量都为1。这道题主要考的是php的弱性质,其中,aaa的判断用的是==,需要使aaa为数字1,根据php将GET或者是POST的参数转换为int类型,或者是两个变量不匹配的时候,会自动地进行变量转换,可以用aaa=1a传参,且php的swicth有一个特点,当它是数字类型的case的判断时,switch会将其中的参数转换为int类型,故$a=1这里就实现了
然后是ccc的传参,不能为整数或整数型字符串,但其值要大于2017,和前面的道理一样,传2018a就可以了,于是$b=1就达成了。最后是ddd的构造,bbb和ddd还有ddd[0]均要为数组,这里由于json_decode(@$_GET['bbb']),bbb自动就是数组了
还要满足ddd的每一个元素都不为’XMAN’,且array_search("XMAN", $bbb["ddd"])函数返回的键名要为’XMAN’,这看起来有点矛盾,但其实也是一个php的弱特性,php的array_search()函数和in_array()都存在一个问题,如果strict参数没有提供,那么这两个函数就会使用松散比较来判断第一个参数是否在第二个数组参数中。当strince的值为true时,函数会比较两个参数的类型是否相同,而用来比较的’XAMN’又会转化成0,于是我们可以构造如下的payload:

Welcome2IRC
这道题根据题目irc就知道,多半是要下载什么客户端,题目的提示也很明显,一个不能打开的地址,还有“欢迎加入#XMAN”,于是,果断去下了一个irc的客户端,注册后用/server 202.112.51.184:6667连接服务器,然后join到#XMAN,就看到flag了:

CTF用户登录
尝试了下基本的注入,发现字符串注入可行

但是过滤了空格、加号和逗号,因为他的登录结果都是有明确的结果回显,所以首先想到了bool盲注,这里的绕过还是很常见的,用括号代替空格,屏蔽符号用#,逗号用for循环代替,于是如下初步的一个paylaod:

然后就是写脚本跑flag,先爆库名:
uaername=admin'and(select(length(database()))=4)#&password=admin&submit=
uaername=admin'and(ascii(mid(database()from(%d)for(1)))>0)#&password=admin&submit=

表名:
这里过滤了逗号,limit 0,1可以用limit 1 offset 0代替,但是很狗血的是空格也过滤了,limit 1 offset 0不能用limit(1)offset(0)代替,于是想到group_concat(),嗯,成功注出表名:
admin'and(ascii(mid((select(group_concat(table_name))from(information_schema.tables)where(table_schema='xman'))from(%d)for(1)))=%d)#

字段名:
admin'and(ascii(mid((select(group_concat(column_name))from(information_schema.columns)where(table_name='ctf_flags'))from(%d)for(1)))=%d)#
Ctf_users的:

Ctf_flags的:

比赛方是个坑逼,flag在ctf_users表的gpass字段和ctf_flags表的ggflag字段里都有:
admin'and(ascii(mid((select(group_concat(ggflag))from(ctf_flags))from(%d)for(1)))=%d)#

ctf_users的flag:
ctf_flags里的经Base64解密后是:

然而这是个错的。。一般谁会去注意看,按照他的提示在ctf_users里找到正确的flag
ctf_users里的解密后是:

------------------------------------------------------------------------------------------------------------------------
看了官方的wp,不想说话,很迷啊这道题
官方的说法是这道题是不用写脚本的,也不是什么bool盲注(我选择狗带),就是让你们花式绕过滤简单的注一下,然后莫名其妙的在登录成功后访问一下index.php(黑人问号.jpg),关于index.php一点提示也没有,一点逻辑也没有,但是flag就出来了【摊手】,如图:

好吧,这种神逻辑暂且不说,但是wp还是有值得学习的地方,比如,用%0a或%0b代替空格,用join代替逗号,双引号可以转换成16进制,join这种方法第一次见,嗯,学习了
未完待续...
Xman资格选拔赛-web的更多相关文章
- [XMAN筛选赛](web)ctf用户登录
0x00 题目概述 就只写了几道web题,有些考察点比较明显,所以个人感觉来说web总体不难. 一航的writeup写得差不多,我这写个他没写的wirteup. 看题: 链接点进去是一个登录页面,习惯 ...
- ASP.NET Identity 简介
翻译自:http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity ,略有改动. 背景:A ...
- 来自BAT大厂前端工程师的自白-怎么才能学好前端
如果说理解学好web前端是先能找到一份工作,那么你应该这样做: 1.制定好一下系统的web前端学习规划,每天定量,学完什么知识点就掌握,能自己应用,而不是能看懂,写不出来东西. 2.不要自己一个人闷头 ...
- SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板
ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...
- Web程序设计基础期末大作业——模仿QQ飞车手游S联赛官网编写的网页
QQ飞车手游是我非常喜欢的游戏,也是我现在为数不多的常在玩的游戏,刚好我Web程序设计基础的大作业是要做一套网站,我就借此机会模仿飞车S联赛官网的页面自己做了一个网页,又加了一些自己的元素,由于我做这 ...
- 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...
- Web系统大规模并发——电商秒杀与抢购
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(四)
SpringSecurity(1) 其实啊,这部分我是最不想写的,因为最麻烦的也是这部分,真的是非常非常的麻烦.关于SpringSecurity的配置,让我折腾了好半天,网上的配置方式一大把,但总有一 ...
- 5款强大的Java Web开发工具
1.WebBuilder这是一款开源的可视化Web应用开发和运行平台.基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发:高效.稳定和可扩展的特点,适合复杂企 ...
随机推荐
- Python urllib简单使用
Python的urllib和urllib2模块都做与请求URL相关的操作. 它们最显著的差异为: urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urll ...
- java课件运行实践
两数相加 源文件:Addition.java 源代码: // An addition program import javax.swing.JOptionPane; // import class ...
- 4.3 数据操纵语言(DML)
本章介绍DML的基本语句. 对数据只能执行以下四种操作:创建(Create)记录.读取(Read)记录.更新(Update)记录值和删除(Delete)记录.这几个词拼写为CRUD——即可对数据执行C ...
- JS中的编码,解码类型及说明
使用ajax向后台提交的时候 由于参数中含有# 默认会被截断 只保留#之前的字符 json格式的字符串则不会被请求到后台的action 可以使用encodeURIComponent在前台进行编码, ...
- @ConfigurationProperties与@value区别
@ConfigurationProperties与@value区别 @ConfigurationProperties @value 功能 批量注入配置文件中的属性 一个个指定 松散绑定 支持 不支 ...
- 深入理解MyBatis的原理(三):配置文件(上)
前言:前文提到一个入门的demo,从这里开始,会了解深入 MyBatis 的配置,本文讲解 MyBatis 的配置文件的用法. 目录 1.properties 元素 2.设置(settings) 3. ...
- 应用程序框架(一):DDD分层架构:领域实体(基础篇)
一.什么是实体 由标识来区分的对象称为实体. 实体的定义隐藏了几个信息: 两个实体对象,只要它们的标识属性值相等,哪怕标识属性以外的所有属性值都不相等,这两个对象也认为是同一个实体,这意味着两个对象是 ...
- Var与Dynamic的区别
1.var与dynamic的区别 C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的 ...
- C# base64 和图片互转
C# imgage图片转base64字符/base64字符串转图片另存成 //图片转为base64编码的字符串 protected string ImgToBase64String(string Im ...
- (利用DOM)在新打开的页面点击关闭当前浏览器窗口
1.在开发过程中我们前端的用户体验中有时候会要求点击一个按钮,关闭当前浏览器窗口.用html DOM就可做到. 2.注意:本次写法要求在新窗口中关闭. target="_blank" ...