CG-CTF web刷题记录
这里刚入门ctf小白一枚 如果有什么地方说错了或者有待改进的地方欢迎指出喔(-w-)
1.签到题
KEY在哪里?
在网页源码里~fn+F12查看网页源码收获flag一枚
2.签到2
打开题目我们看到题目让给我们输入口令:zhimakaimen
可是输入了之后依然报错呢F12看一下网页源代码
在maxlength处限制了我们输入字符的长度 我们将它改成11
重新输入 “zhimakaimen” 获取flag
3.md5 collision
题目中我们已经给出了源码
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){if ($a != 'QNKCDZO' && $md51 == $md52) {echo "nctf{*****************}";
} else {echo "false!!!";
}}
else{echo "please input a";}
1.变量md51的值是字符串“QNKCDZO"经MD5加密后的值
2.变量a以get方式传入
3.md52的值是变量a经md5加密后的密文
4.我们又看到第二个if判断:当a不等于’QNKCDZO’但是a加密后的值要和’QNKCDZO’加密后的值一样 我们才能拿到flag
这里就涉及到一个 php弱类型的题目
参考资料:php 弱类型总结
== 在进行比较的时候,会先将字符串类型转化成相同再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
我们利用在线加密 可以看到字符串经加密是0e开头的(想到科学计数法) 也就是说它在比较的时候会被转换成0
也就是说只要我们令变量a的值是一个经md5加密后的密文是0e开头的就好了(这样的值在上文给出的链接里面有很多)
4.bypass again
题目中已经给出提示 依旧是弱类型的题目
点开就可以看到页面的源码
if (isset($_GET['a']) and isset($_GET['b'])) {if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
解法1:
同3一样,找两个经md5加密后都是0e开头的字符串
解法2:
利用fastcoll生成!
1)新建一个md5.txt文件 写入任意内容
2)在cmd中输入指令:fastcoll_v1.0.0.5.exe -p md5.txt -o md51.txt md52.txt
3)散列值生成中
4)
由于生成的是乱码 我们利用python:
from urllib import parse
result = parse.quote(open('md51.txt','rb').read())
print(result)
result2 = parse.quote(open('md52.txt','rb').read())
print(result2)
5.这题不是web
显然这是一道图片隐写题解法1:利用winhex查看文件被隐藏起来的数据
winhex下载链接
拉到最下面就可以看到我们的flag啦
解法2:直接用记事本打开题目的图片
拉到最下面也能看到flag
6.层层递进
F12查看页面源码 发现可疑路径 SO.html
访问 在网页源码看到可疑路径S0.html
接着访问 看到第三个可疑路径 SO.htm
接着访问 然后看到第四个可疑路径 S0.htm
访问 然后看到可以路径404.html
接着访问该链接 然后查看页面源码 就可以看到flag
7.AAencode
打开题目看到是一串乱码 将页面保存到桌面 打开看看
可以看到是一串颜文字 我们用Firefox浏览器的控制台解码得到flag
8.phpdecode
题目给出一个类似解密器的代码 //从decode看出的(逃
<?php
function CLsI($ZzvSWE) {$ZzvSWE = gzinflate(base64_decode($ZzvSWE));//base64解密for ($i = 0; $i < strlen($ZzvSWE); $i++) {$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);//遍历每一个字符输出它的ascii码减一的值}return $ZzvSWE;//只要我们将return改成echo就输出了我们想要的数据}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));//定义一个字符串并返回它经过解密的值
?>
将代码改成如下,并将其存到phpstudy的WWW目录下
<?php
function CLsI($ZzvSWE) {$ZzvSWE = gzinflate(base64_decode($ZzvSWE));for ($i = 0; $i < strlen($ZzvSWE); $i++) {$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);}echo $ZzvSWE;}
CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==");
?>
打开phpstudy
访问http://127.0.0.1/phpdecode.php 拿到flag
9.文件包含
由题目给出的提示可知这是一道利用LFI文件包含漏洞的问题(也可以从URL的“file=”看出)。
根据题目的意思来到了这个界面
首先我们尝试基本的LFI攻击:使用(…/)或简单地(/)从目录中直接读取文件的内容
似乎看不出什么(挠头
看了一个师傅的博客 博客链接
想到可以利用php伪协议查看经base64加密过后的index.php的源码
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
利用base64解码 获取flag
10.COOKIE
BP抓包
将COOKIE改成Login=1即可
11.单身20年
顺着题目的意思来到了这个页面
我们可以看到这时候是跳转到了no_key_is_here_forever.php
但是我们回到原来的页面查看源码 发现它本应该跳转到./search_key.php
利用BP抓包
在HTTP history里面找到访问的记录 获取flag
ps:还有个题目叫“单身一百年也没用“跟这道题做法相同 就不记录啦~
12.MYSQL
根据提示我们访问根目录下的robots.txt文件
TIP:sql.php<?php
if($_GET[id]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$id = intval($_GET[id]);//以get方式传入变量id并对其取整$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));//sql查询语句if ($_GET[id]==1024) {echo "<p>no! try again</p>";//限制id不可以等于整数的1024}else{echo($query[content]);//我们想要查询的是id=1024里面的内容}
}
?>
这里给了一个提示:sql.php 说明我们要先进去这个文件
这里我们要说到intval函数有一个特点:1024.0会被认为是整数1024,所以我们只要get一个id变量等于1024.1即可
13./x00
题目直接给了源码
if (isset ($_GET['nctf'])) {if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)echo '必须输入数字才行';//限制nctf必须由数字组成else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag);//限制nctf中必须有#biubiubiuelseecho '骚年,继续努力吧啊~';}
利用/x00截断正则匹配 获取flag
payload:
?nctf=1%00%23biubiubiu
参考资料:ereg()截断漏洞
14.变量覆盖
截取源码的关键部分进行分析
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?><?phpextract($_POST);if ($pass == $thepassword_123) { ?><div class="alert alert-success"><code><?php echo $theflag; ?></code></div><?php } ?><?php } ?>
这里有一个extract() 函数 将post进去的键值对定义为变量,但是如果原来就存在同名的变量,这个函数会将其覆盖。 也就是说,原来有pass变量和thepassword_123变量并且这两个变量一定是不相等的,新post进去的会将其原来的覆盖掉。
所以我们post两个相等的值 就获取了flag
15.伪装者
题目提示我们要本地访问,也就是我们的ip地址要是127.0.0.1
参考资料:CTF中伪造IP的几种方法
16.上传绕过
题目提示我们要上传文件 我们上传一个一句话木马看看
提示我们要上传的文件类型
上传一张图看看
又说让咱们传php文件(挠头
请教了npy。。他告诉我用00截断试试。。
1)先将上传的文件名改成xx.php.jpg(我这里直接改成muma.php.jpg)
2)上传 抓包
3)在uploads文件夹下添加我们上传的文件名
4)去Hex查看,找到uploads目录下的我们上传的文件名,将.jpg的"."对应的十六进制的值改成00 返回Raw查看 就可以看到原来的.变成了一个小方框,表示我们截断成功,也就是说我们上传的文件可以被识别为.jpg文件但是上传之后是一个.php文件。
5)放包 获取flag
17.pass check
题目已经给出了关键源码
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{if(@!strcmp($pass,$pass1)){echo "flag:nctf{*}";
}else{echo "the pass is wrong!";
}
}else{echo "please input pass!";
}
?>
大概的意思就是当post进的pass和原先设定的pass1相等输出flag
这里考察的就是一个strcmp函数的漏洞:在5.3版本前,如果传入的不是字符串(比如传入数组),那么会报错,并且return 0,在本题中就输出flag了
18.起名字真难
<?php
function noother_says_correct($number)
{$one = ord('1');$nine = ord('9');for ($i = 0; $i < strlen($number); $i++){ $digit = ord($number{$i});if ( ($digit >= $one) && ($digit <= $nine) ){return false;}}return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))echo $flag;
else echo 'access denied';
?>
1.ord()函数:它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值。
2.for循环判断我们传入的变量key是否由数字组成,如果是的话 返回false,不是的话 令参数等于54975581388并返回1,为了绕过这个for循环我们将54975581388转换成十六进制发现是ccccccccc,刚好可以绕过for循环。
19.密码重置
题目要求我们重置的账号是:admin
发现账号名改不了 但是url里面显示了一串bas64加密后的密文
解密之后发现刚好是我们的账号名ctfuser
抓包
我们加密admin
Send to Repeater 改包之后 GO
20.SQL注入1
<?php
if($_POST[user] && $_POST[pass]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$user = trim($_POST[user]);$pass = md5(trim($_POST[pass]));$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";echo '</br>'.$sql;$query = mysql_fetch_array(mysql_query($sql));if($query[user]=="admin") {echo "<p>Logged in! flag:******************** </p>";}if($query[user] != "admin") {echo("<p>You are not admin!</p>");}
}
题目限制我们输入的用户名必须是admin
关键语句:
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"
可以用最基本的sql注入:admin’) or 1=1#(密码任意 因为已经被#注释掉了)
原理是这样的:
这里记得一定要加右括号 否则user前面的左括号无法闭合
提交查询
21.SQL注入2
题目已经提示我们考察的是union联合查询。
看看关键代码行:
$user = $_POST[user];$pass = md5($_POST[pass]);$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {echo "<p>Logged in! Key: ntcf{**************} </p>";}
我们输入的密码经md5加密之后跟数据库中找到的pw比较,如果存在这样的pw并且两者相同的话输出flag
即post : user=‘ union select md5(2)#&pass=2
获取flag
22.SQL Injection
查看页面源代码 关注一下关键代码段
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
\是一个转义符 后面加上‘仅仅就是表示一个单引号 不再起闭合作用了。
这样我们能清楚看到这行代码中有四个单引号被转义了。
我们不知道这个数据库中都有那些数据 但是题目要求我们查询到存在的值才能输出flag,所以我们考虑get name=admin\ or 1=1#来进行sql注入。
我们的语句就变成了这样:(为了便于观察 我把转义的单引号先去掉了)
SELECT * FROM users WHERE name='admin\' AND pass=' or 1=1#';
这样我们get一个name变量值为admin’ AND pass= 不管这个变量是否能在数据库中查询到 我们后面执行的恒真句1=1总能让我们成功绕过登陆验证。
22.综合题
将这些个玩意儿复制到控制台执行看看
接着访问
尝试抓包
发现有tip:history of bash
回到一开始 访问:
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
./代表当前目录 接着访问
teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip
并下载该压缩包 解压
打开就看到flag了!
CG-CTF web刷题记录相关推荐
- BUU WEB刷题记录1(持续更新)
[MRCTF2020]你传你马呢 打开得到一张晦气的图片和文件上传点 尝试直接上传PHP文件失败(意料之中),随便上传了一张png图片,发现可以,将png文件内容改写成一句话木马<?php @e ...
- CG CTF WEB 综合题2
http://cms.nuptzj.cn/ 题解: MzAzMTY3YWQxZDlmZmUyNGIxOWNjZWI1OWY4NzA3ZmU= base64解密 303167ad1d9ffe24b19c ...
- CG CTF WEB 综合题
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/index.php 题解: [][(![]+[])[!![]+!![] ...
- CG CTF WEB 这题不是WEB
http://chinalover.sinaapp.com/web2/index.html 题解: 下载图片 记事本方式打开
- CG CTF WEB 签到题
http://chinalover.sinaapp.com/web1/ 题解: 审查元素 注释
- 2021.11.08【web刷题记录】
SSTI模板注入 模板引擎注入 参考https://www.cnblogs.com/wangtanzhi/p/12238779.html https://blog.csdn.net/m0_551094 ...
- CTFShow web入门题刷题记录
CTFShow web入门题刷题记录(信息搜集) web1 提示:开发注释未及时删除 打开网页查看源代码发现 flag:flag{2b2cf8e3-f880-41e1-a8ff-02601b3d998 ...
- CTF BugKu平台——Crypto篇刷题记录(后续更新)
CTF BugKu平台--Crypto篇 前言 抄错的字符: /.- 聪明的小羊: ok: [+-<>]: 把猪困在猪圈里: 你喜欢下棋吗: 小山丘的秘密: EN-气泡: 你以为是md5吗 ...
- BUUCTF-2020寒假刷题记录
BUUCTF-2020寒假刷题记录 Web [RoarCTF 2019]Easy Calc 打开源码,看到calc.php,打开看到源码. 在 num 前面加个空格即可绕过 ? num=phpinfo ...
最新文章
- 事务隔离机制原理分析以及是否可以防止订单超卖
- 凸现三围的健身运动法
- Java基础部分自测题(持续更新)
- 使用Powerdesigner的逆向工程生成PDM(主要是注释可以放进去)
- SlidingMenu实现侧滑
- 广文艺计算机综合美术,广东文艺职业学院2018年第二批合同制人员招聘专业技能考核和试讲题目...
- python cookbook 自营_Python Cookbook总结 7-8 章
- 《5G新体制天线技术》
- 找出两个字符串数组中的相同元素
- 50道编程小题目之【判断是一年的第几天】
- 知网查重提交论文显示服务器错误,职称论文在进行知网查重时,经常出现的错误有哪些?...
- Gnome3桌面美化
- 自学-CAD零基础视频教程网站
- 用 Python 分析《长安十二时辰》
- Matplotlib绘图9种经典风格,你喜欢哪种?
- 【养生】【作息】作息+十二时辰养生
- Debian8下安装配置PostgreSQL
- python lambda函数for 字符串_Python Lambda
- 教你用ILMerge来合并dll以及将dll合并进exe文件中
- linux中execve函数的用法
热门文章
- [编程题] 钓鱼比赛
- java自定义监听器例子_Java使用自定义注解实现为事件源绑定事件监听器操作示例...
- ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)
- 找工作总结-机会往往留给有准备的人
- 你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
- python语法讲解小白入门第一篇
- 《中国垒球》:晋级决赛·剑指冠军
- 语音转文字软件哪个好用?建议收藏这些软件
- 计算渐变色的RGB值
- java程序设置开机自启动