在此记录学习ctf的过程。
目录
1.GFSJ0482.weak_auth
先输入用户名和密码测试一下
显示
这时候使用burp抓包。看一下具体信息
发送到intruder
开始爆破
2. GFSJ0485.simple_php
题目如下
逐步分析
<?php
show_source(__FILE__);//此命令会显示当前文件的源代码,通常用于调试和学习目的。
include("config.php");//包含(导入)一个名为"config.php"的文件。这个文件可能包含一些配置信息等
//这两行代码从GET请求中获取两个参数,分别赋值给变量$a和$b。@操作符用于抑制错误信息,即使请求的参数不存在也不会产生错误
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){//$a是否等于0并且存在(不是null)。如果满足条件,则输出变量$flag1的值
echo $flag1;
}
if(is_numeric($b)){//检查变量$b是否为数字。如果是,则程序停止执行(exit()函数的作用)
exit();
}
if($b>1234){//如果变量$b的值大于1234,则输出变量$flag2的值。
echo $flag2;
}
?>
看到这有两个矛盾
1.a要等于0还要存在
2.b不是数字但要大于1234
这就涉及了php字符串比较了
在php里字符串与数字类型比较,字符串会先转换数字类型,
- 如果数字字符串开头具有字母,如"a1234",它都是零
- 如果数字字符串结尾或中间具有字母,只转换前面数字部分
了解后,可以写payload
a=a123&b=1235b
3.GFSJ0712.baby_web
根据题目要求初始页面为index.php,然后访问一下,使用burp抓包
发送到Repeater
4.GFSJ1004.inget
看到题目第一时间想到id爆破但试了很久没有成功,猜想可能是sql注入,知识点在这
sql注入基础原理(超详细)_sql注入原理图-CSDN博客
输入sql注入语句 1'or 1=1--+,--+是注释后面语句
5.GFSJ1004.fileinclude
题目告诉我们flag在flag.php文件里,但是不知道flag.php文件在哪,右键检查看看到提示
逐一分析
<!--?php
if( !ini_get('display_errors') ) {//检查当前的PHP配置中是否显示错误信息。如果display_errors没有被设置或者为off,那么这行代码会将其设置为on
ini_set('display_errors', 'On');//直接设置display_errors为on,以确保错误信息在页面上显示。
}
error_reporting(E_ALL);//开启所有的错误报告,这意味着所有的PHP错误(包括警告和通知)都会被报告。
$lan = $_COOKIE['language'];//从用户的cookie中获取语言设置。
if(!$lan)// 如果cookie中没有设置语言,这执行以下语句
{
@setcookie("language","english");//设置默认语言为英语
@include("english.php");//包含英语内容的文件
}
else
{
@include($lan.".php");//包含相应语言的文件
}
$x=file_get_contents('index.php');// 读取并存储index.php文件的内容到变量$x
echo $x;
?-->
分析可知出现了文件漏洞,知识点在这https://blog.csdn.net/m0_46467017/article/details/126380415
如果将名为 language
的 cookie 设置为 php://filter/read=convert.base64-encode/resource=flag,
代码会将该 cookie 的值作为 PHP 文件路径,并尝试读取该文件的内容.
Cookie: language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
使用burp抓包,发送到Repeater
解码得到答案
6.GFSJ0481.xff_referer
题目非常明确
需要了解X-Forwarded-For和Referer的知识
- X-Forwarded-For:X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP
- Referer:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
使用burp抓包,发送到Repeater
X-Forwarded-For: 123.123.123.123
Referer: https://www.google.com
设置Referer: https://www.google.com
7.GFSJ0627.web2
目的很明显,写出对应的解密函数就行。
先分析函数
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function encode($str){
$_o=strrev($str);
// echo $_o;
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}
highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>
里面只要知道几个函数就行了
strrev(string): 反转字符串
strlen(string): 返回字符串的长度
substr(string, start, length): 返回字符串,从start开始,长度为length
ord(string): 返回字符串首个字符的 ASCII 值
chr(): 从指定的 ASCII 值返回对应的字符
str_rot13(string): 对字符串执行 ROT13 编码
base64_encode(string): 使用base64对数据进行编码
注意:在PHP中,$_=$_.$_c; 的意思是将变量 $_c 的值追加到变量 $_ 的末尾。这里的 . 是字符串连接操作符,用于将两个字符串连接在一起。
过程:循环开始:给encode一个参数 $str
将所传参数 $str 通过 strrev() 函数反转字符串操作并赋值给 $_o
循环遍历 变量 $_o
在for循环中首先依次取字符串 $_o 的第 $_0 个值,赋值给 $_c
将变量 $c 转化为 ASCII码 并 +1,赋值给 $_
将 $__ 转化为该ASCII码所对应的字符,赋值给 $_c
拼接字符串,赋值给 $_ , 循环结束。
将拼接好后的字符串 $_ 进行 base64编码
将编码后的值进行反转字符串操作
对反转后的字符串进行 rot13 加密
得出结果为 $miwen
解密函数
<?function decode($str){
$_o = base64_decode(strrev(str_rot13($str)));
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
echo decode($miwen)
?>
得出答案:flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
8.1059.easyphp
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
$a = $_GET['a'];
$b = $_GET['b'];
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
$key1 = 1;
}else{
die("Emmm...再想想");
}
}else{
die("Emmm...");
}
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}
if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
}
?> Emmm...
答案取于攻防世界