CTF中的一些常见骚操作(可以没有,但不能不会)

0X01:前言

近期刷了挺多的ctf题,总结了一些ctf中常见的骚姿势。

0X02:来啦来啦,骚姿势总结

一. 弱类型比较

ctf中见怪不怪了,经常已经知道题目要考察的是什么知识了,传参都要用个弱类型比较来为难一下我们。

  1. ‘=’,‘’,‘=’
    一个等于是赋值,两个等于是将两个变量转相同的类型再比较,三个等于先比较变量类型是否相同再比较值。

  2. 非相同类型比较
    如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

先看几组比较结果:

image

image

image

image

当我们用字符串与数值类型比较时会将字符转变为数值,与C语言不同的是,他这里并不会转变为ascii码,而是将开头的数字转为对应的数值,开头没有数字则转为0,”0e123456”==”0e456789”相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。

PHP手册是这么说明的:

当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.’,‘e’,'E’并且其数值值在整形的范围之内 该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

0X03弱类型比较的利用

1.md5绕过,当传入的参数哈希值为0e开头时有可能触发。
2.json绕过,当我们不知道键的名字时可以尝试传入0,尝试能否满足形似0==“admin”
3.array_search is_array绕过。
4.strcmp漏洞绕过,要求PHP版本<5.3

0X04总结

正如所说,我们和开发最大的不同就是学习这些冷门的奇技淫巧。还有就是,代码功底正是很重要,后悔浪费了前两年,走马观花式学习,现在开始恶补java和PHP。
最后附上一句正在某互联网大厂做PM的前辈对我说过得的话:互联网是现在为数不多的可以靠努力改变现状的机会,年轻的时候不拼一把,简直是浪费。

耳听为虚,眼见为实,用代码说话

1.MD5绕过
<?php
use phpDocumentor\Reflection\Types\Null_;
header('Content-type:text/html;charset=utf-8');
show_source(__FILE__);
?>
<html>
<body>
<title>md5绕过</title>
<meta  charset="utf-8">
</body>

<body>
<form  method="POST">
Str1:<input  type="text"  name="str1"><br>
Str2:<input  type="text"  name="str2"><br>
<input  type="submit"  value="提交">
</form>
</body>

</html>
<?php
$var1 = $_POST["str1"];
$var2 = $_POST["str2"];
if  (isset($var1)  && isset($var2)  && $var1 !==  Null  && $var2 !==  Null)  {
if  (md5($var1)  == md5($var2))  {
echo ("bypass success!!!<br>");
echo ("md5_1 = "  . md5($var1)  .  "<br>");
echo ("md5_2 = "  . md5($var2));
}  else  {
echo ("sorry,please hack me again!");
}
}

image

这边传入的值不一样,md5值也不同但是都是0exxxxxx格式的,在比较前做类型转换时会被当作科学计数法值为0所以bypass成功

2.json绕过
<html>
<head>
<title>json绕过</title>
<meta  charset="uft-8">
</head>

<body>
<form  method="POST">
message:<input  type="test"  name="message">
<input  type="submit"  name="提交">
</form>
</body>

</html>
<?php
show_source(__FILE__);
header('Content-type:text/html;charset="utf-8"');
if  (isset($_POST['message']))  {
$message = json_decode($_POST['message']);
$key =  "admin";
if  ($message->key == $key)  {
echo "success";
}  else  {
echo "fail";
}
}

image

输入一个数组进行json解码,如果解码后的message与key值相同,会得到flag,主要思想还是弱类型进行绕过,我们不知道key值是什莫,但是我们知道一件事就是它肯定是字符串,这样就可以了,上文讲过,两个等号时会转化成同一类型再进行比较,直接构造一个0就可以相等了。最终payload message={“key”:0}

3.array_search is_array绕过
<?php
if(!is_array($_GET['test'])){exit();}
$test=$_GET['test'];
for($i=0;$i<count($test);$i++){
if($test[$i]==="admin"){
echo "error";
exit();
}
$test[$i]=intval($test[$i]);
}
if(array_search("admin",$test)===0){
echo "flag";
}
else{
echo "false";
}
?>

这段代码的意思就是先判断是不是数组,然后在把数组中的内容一个个进行遍历,所有内容都不能等于admin,类型也必须相同,然后转化成int型,然后再进行比较如果填入值与admin相同,则返回flag,如何绕过呢?

基本思路还是不变,因为用的是三个等于号,所以说“= =”号这个方法基本不能用,那就用第二条思路,利用函数接入到了不符合的类型返回“0”这个特性,直接绕过检测。所以payload:test[]=0。

在PHP手册中,in_array()函数的解释是bool in_array ( mixed needle,arrayhaystack [, bool strict=FALSE]),如果strict参数没有提供或者是false(true会进行严格的过滤),那么inarray就会使用松散比较来判断needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));  //true
4.strcmp漏洞绕过(PHP版本<5.3)
<?php
show_source(__FILE__);
error_reporting(0);
$var1 = $_REQUEST['string1'];
$var2 = $_REQUEST['string2'];
echo ("String1:"  . $var1 .  "  "  .  "type:"  . gettype($var1));
?>
<br>
<?php
echo ("String2:"  . $var2 .  "  "  .  "type:"  . gettype($var2));`
?>
<br>
<?php
$bool = strcmp($var1, $var2);
if  ($bool <  0)  {
echo $bool .  '<br>';
echo ("str1<str2");
} elseif ($bool ==  0)  {
echo $bool .  '<br>';
echo ("str1=str2");
}  else  {
echo $bool .  '<br>';
echo ("str1>str2");
}

image

语法:strcmp(string1,string2)

返回值:
0 - 如果两个字符串相等
0 - 如果 string1 小于 string2
0 - 如果 string1 大于 string2
漏洞:在PHP5.3之前,传入非String类型的会返回0,即相等。

为了回馈读者,我整理了一些CTF相关的资源供大家阅读,【点我查看文档】

image.png

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
CTF(Capture The Flag,夺旗赛)是一种网络安全竞赛,其涉及到图片隐写术的应用。图片隐写是一种将信息隐藏在图像的技术,使得除了原本的图像外,其他人很难察觉到存在着隐藏的信息。 在CTF常见的图片隐写术包括: 1. LSB隐写:最常见的图片隐写术之一,通过修改图像像素的最低有效位来隐藏信息。这种方法对于人眼来说几乎不可察觉,而且可以应用于不同的图片格式。 2. 色彩平面隐写:将隐藏信息分散在各个色彩平面上,通过修改色彩通道的最低有效位来隐藏信息。相比于LSB隐写,这种方法在保持图像视觉质量的同时使得隐藏的信息更难被发现。 3. 频域隐写:利用图像的频域信息,如傅立叶变换等,将隐藏信息嵌入图像。通过对频域进行操作,隐藏的信息可以更加难以被探测到。 4. 容器隐写:将隐藏信息嵌入到图片文件的非图像数据部分,如EXIF信息、文件尾端等。这种方法可以绕过对图像本身的修改检测。 5. 混合隐写:结合多种隐写术的方法,将隐藏信息嵌入图像。例如,可以先通过LSB隐写将信息嵌入到图像,然后再通过频域隐写对图像进行处理。 在CTF比赛,参赛选手可能需要进行图片隐写的解密任务,以获取隐藏的信息。他们可以使用各种工具和技术来查看和修改图像,以寻找隐藏的信息。常用的图片隐写相关工具包括Steghide、Stegsolve等。另外,了解常用的隐写术原理,对于解决隐写任务也是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值