CTFshow web93-104关

这篇具有很好参考价值的文章主要介绍了CTFshow web93-104关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关

93关

看代码 进行分析

CTFshow web93-104关,android

他的主函数


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

 解析:

输入一个变量 num 进行get传参 如果num=4476 返回错误 

传入num 用函数preg_match进行匹配,如果匹配到则返回错误

再根据intval函数的取整的特性,传入payload:?num=4476.1/?num=010574(加0是因为intval 函数检测时字符串以 "0" 开始,使用 8 进制)

知识点:

php中使用两个等号“==” 比较,只比较值,不比较类型(两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。所以他比较的就只是值 ,不比较类型。)

intval 函数用于获取变量的整数值,intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。

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

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

实例:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

CTFshow web93-104关,android

CTFshow web93-104关,android

94关

CTFshow web93-104关,android

 只比93关多了一个  !strpos($num, "0")

知识点:

strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

CTFshow web93-104关,android

解析:

我们还是可以利用8进制进行绕过或者小数绕过,但是因为strpos函数特性 要在8进制前加+或者加空格 ,小数应该是0 payload:?num=4476.0/?num=+010574

CTFshow web93-104关,android

95关

CTFshow web93-104关,android

解析:

  if(preg_match("/[a-z]/i", $num)){

 if(preg_match("/[a-z]|\./i", $num)){  95关

与之前不同的地方在正则匹配这里,多了一个. 其他的没变

还是用之前的payload:?num=+010574

CTFshow web93-104关,android

96关

 CTFshow web93-104关,android

知识点:

这题看到了flag.php 应该是让我们找文件路径的题,找文件路径可以用

php伪协议filter

/var/www/html/flag.php(/var/www/html 只是Web服务器的默认根文件夹)

./flag.php(在linux下面表示当前目录是 "./" " . ./"代表上一层目录 “/”:代表根目录.)

解析:

payload:/var/www/html/flag.php    ./flag.php    php://filter/resource=flag.php

php://filter/read=convert.base64-encode/resource=flag.php (base64编码的伪协议使用)

CTFshow web93-104关,android

97关

CTFshow web93-104关,android

 知识点:

属于php md5强比较绕过

在 php 中,=== 代表着强比较,不仅仅会比较值,还会比较类型。因此这里不能在使用上面的方式进行绕过了。

要绕过此处的比较,需要向 md5() 函数中传入数组,md5() 函数中如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为 True 绕过。

解析:

因此这里可以使用数组绕过

payload:a[]=1&b[]=2

是post传参而不是get传参

CTFshow web93-104关,android

98关

CTFshow web93-104关,android

知识点:

php三元换算符

CTFshow web93-104关,android

解析:

 $_GET?$_GET=&$_POST:'flag' 如果存在GET请求,则用POST请求传入的值将其覆盖掉.

$_GET['HTTP_FLAG']=='flag'?$flag:__FILE__ GET传入的HTTP_FLAG的值为flag,则输出flag.

所以POST:HTTP_FLAG=flag;GET随便传什么都行.

CTFshow web93-104关,android

 CTFshow web93-104关,android

99关

CTFshow web93-104关,android

 知识点:

array函数

CTFshow web93-104关,android

array_push函数

CTFshow web93-104关,android

 in_array函数CTFshow web93-104关,android

file_put_contents() 函数把一个字符串写入文件中。

该函数访问文件时,遵循以下规则:

  1. 如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径
  2. 如果文件不存在,将创建一个文件
  3. 打开文件
  4. 如果设置了 LOCK_EX,那么将锁定文件
  5. 如果设置了 FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容
  6. 向文件中写入数据
  7. 关闭文件并对所有文件解锁

如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

CTFshow web93-104关,android

解析:

通过看这三个函数,知道了$allow = array()是设置了数组

0x36d是877的十六进制。for语句是一个循环结构,$i从36开始,每次与877作比较,只要小于877,则让$i加1。每次for语句执行成功,也就是加1都会执行下面的array_push函数。

array_push($allow, rand(1,$i))在1-$i之间随机生成一个整数,添加到数组$allow尾部

if(isset($_GET['n']) && in_array($_GET['n'], $allow)) 从这里可以看出in_array函数使用的是弱比较 因为他没有设置第三个参数为true 所以我们传入1.php就相当于传入了1 这里也是这题的主要考点

file_put_contents($_GET['n'], $_POST['content']); 这句话就是get传参并用post传入内容

所以post就可以传入命令执行语句,get传入1.php就可以绕过,因为数字1正好在 range(1,24)数组中,当随机生成的数字正好是1时就可以绕过 in_array()函数判断

解析:

payload: get: ?n=1.php   post:  content=<?php system('ls');?>

传入以后就可以找到1.php的页面执行命令找到了存放flag的文件

CTFshow web93-104关,android

再用2.php读取flag文件

CTFshow web93-104关,android

 CTFshow web93-104关,android

100关

CTFshow web93-104关,android

 知识点:

考察的是运算符的优先级  :&& > || > = > and > or

运算符优先级的划分如下:

()小括号优先级最高

! 优先级高于 算术运算符

算术运算符 优先级高于 关系运算符

关系运算符优先级高于 "&&"和"||"

"&&"和"||"优先级高于 "="

运算符的种类还有很多,在往后的学习中我们就会慢慢地接触到,所以,在同一行代码中,

如果出现多种不同优先级的运算符时,最好还是加上小括号,这样才会比较直观。

(3)同等优先级的运算符,执行顺序的划分:

算术运算符 —— 乘法、除法、取余运算 优先级高于 加法、减法。

算术运算符 —— 乘法、除法、取余运算 出现在同一行代码中,则按从左到右的顺序执行。

算术运算符 —— 加法、减法, 出现在同一行代码中,则按从左到右的顺序执行。

关系运算术——出现在同一行代码中,按从左往右顺序执行。

 

CTFshow web93-104关,android​ 

 解析:

is_numeric函数 用于检测变量是否为数字或数字字符串

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); 关键在这句

因为=比and优先 所以v0的值是v1赋的 所以v0=is_numeric($v1) 看到代码后面有eval函数

想到命令执行

这需要$v2传入命令,$v3需要;结尾,但这么一来is_numeric一处理就变成了

$vo = $v1 and FALSE and FAlse

if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3))

再根据这两句,v2必须没有;v3必须

payload: /?v1=1&v2=system('ls')&v3=;

CTFshow web93-104关,android

找到了包含flag的文件 但是点开什么都没有 打开ctfshow.php看看

/?v1=1&v2=system('tac ctfshow.php')&v3=;     (这里用tac的原因是发现cat不行然后换了一下)

CTFshow web93-104关,android

发现了flag 0x2d是16进制的- 转换一下就好了

101关

 CTFshow web93-104关,android

不一样的地方在于把v2 v3的条件给改了

if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){

知识点

新学习到了反射

反射,通俗来讲就是可以通过一个对象来获取所属类的具体内容,php中内置了强大的反射API:

    ReflectionClass:一个反射类,功能十分强大,内置了各种获取类信息的方法,创建方式为new ReflectionClass(str 类名),可以用echo new ReflectionClass(‘className’)打印类的信息。

    ReflectionObject:另一个反射类,创建方式为new ReflectionObject(对象名)。

 

API:API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数

php反射类_php 反射类_raoxiaoya的博客-CSDN博客具体的可以看这个大佬的博客 就不做具体说明了

所以我们在这里可以直接用反射类的方法来做这道题

解析:

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

CTFshow web93-104关,android

这里的flag是少了一位的 可以用bp抓包爆破 也可以一个一个字符尝试

102关

 CTFshow web93-104关,android

 知识点:

substr() 函数返回字符串的一部分。

注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。

CTFshow web93-104关,android call_user_func():调用一个回调函数处理字符串,
可以用匿名函数,可以用有名函数,可以传递类的方法,
用有名函数时,只需传函数的名称
用类的方法时,要传类的名称和方法名
传递的第一个参数必须为函数名,或者匿名函数,或者方法
其他参数,可传一个参数,或者多个参数,这些参数会自动传递到回调函数中
而回调函数,可以通过传参,获取这些参数
返回回调函数处理后的结果

【php】php中call_user_func函数的用法_call_user_func用在什么时候_yanhui_wei的博客-CSDN博客

解析:

<?phphighlight_file(__FILE__);$v1 = $_POST['v1'];$v2 = $_GET['v2'];$v3 = $_GET['v3'];$v4 = is_numeric($v2) and is_numeric($v3); 
 通过将变量v2执行的命令base64加密后转换成16进制字符串来使得变量v4为ture 
if($v4){    $s = substr($v2,2);   $str = call_user_func($v1,$s);
通过变量v1调用hex2bin函数将变量v2的16进制字符串转换成原来的base64编码形式(因为这里v2只使用数字 并且是在第二位之后即第三位开始读取suo'y)
echo $str;    file_put_contents($v3,$str);
通过使用php://filter伪协议写入webshell

get传参v2和v3,post传参v1;if中需要v4为真才能往下执行,而v4要为真就是v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell,为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字。

payload:

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

post: v1=hex2bin

(<?=`cat *`;——base64:PD89YGNhdCAqYDs=——16进制:5044383959474e6864434171594473) (v3为伪协议)

CTFshow web93-104关,android

 文章来源地址https://www.toymoban.com/news/detail-633380.html

在访问1.php 得到flag

CTFshow web93-104关,android

 103关

CTFshow web93-104关,android

看代码发现和102关没什么区别 该绕过的都用base64以及16进制绕过了 可以沿用102关的payload

CTFshow web93-104关,android

都是在页面的源代码里找到的flag

104关

CTFshow web93-104关,android

 知识点:

sha1()函数特性,sha1函数无法处理数组,遇到数组会返回NULL

解析:

get传入v2 post传入v1 让两个变量的sha1值相等 用的是弱比较

payload: get: v2[]=1  post: v1[]=1

CTFshow web93-104关,android

得到flag

php代码审计作业题到此结束 通过这些题也找到了代码审计方面的做题思路,一些不认识的函数也认识了不少 但是不足也很明显,好多函数的特性并没有了解过,看到简单的代码还行 如果有复杂的代码还是头大 欠缺的地方很多 到实际的时候也没有那么多时间让你去查函数  还是要花功夫去记函数的

 

 

到了这里,关于CTFshow web93-104关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ctfshow命令执行(web29-web52)

    目录 web29 web30 web31 web32 web33 web34 web35 web36 web37 web38 web39 web40 web41 web42 web43 web44 web45 web46 web47 web48 web49 web50 web51 web52 代码解释判断是否存在GET型参数c 如果存在赋值给变量c 如果参数值没有匹配到字符串flag则执行代码 eval() 直接传参 第一种方法 ?c=system(\\\'ls\\\'); ?c=system(\\\'tac f*\\\'); 第二

    2024年01月20日
    浏览(40)
  • CTFSHOW菜狗杯 web

    简单的解释下这个嵌套 加入cookie中传入 CTFshow-QQ群:=a 那么就会出现 $_POST[\\\'a\\\'] ,假如post传入的值为 a=b ,那么就会得到 $_GET[\\\'b\\\'] ,接着假如get传入 b=c 就会得到 $_REQUEST[\\\'c\\\'] 。 而 $_REQUEST 就get、post都可以接收啦。 加入再get传入 c=123 那么前面这一部分( $_REQUEST[$_GET[$_POST[$_COOKIE[

    2023年04月08日
    浏览(40)
  • CTFshow web入门 web316-web333 XSS

    我tm又来了,总之top10先过一遍,到第三个XSS了,下一个要去看了,看了网上很多wp总感觉不是太全,所以就自己写了一个 网站没有对用户提交的数据进行转义处理或者过滤不足,从而被恶意攻击者利用进而被添加一些恶意可执行脚本嵌入到web页面中去,使别的用户访问都会执

    2024年02月03日
    浏览(43)
  • ctfshow web入门 ssrf web351-355

    尝试访问本机的flag.php payload: 必须要用http或https,ip没有过滤因为匹配时没加变量,恒为真 payload: 必须要用http或https,过滤了127.0.,只要匹配到了127.0.就不能继续执行了 windows 0代表0.0.0.0 linux 0代表 127.0.0.1 可以用0代替127.0.0.1 payload: 过滤了0和1,可以把域名解析到127.0.0.1 http:/

    2024年02月05日
    浏览(53)
  • ctfshow php特性(web89-web101)

    目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100  web101 php特性(php基础知识) preg_match 函数正则匹配0-9 如果匹配到就失败 intval将参数值转换为整数类型 这就犯冲突了 但是preg_match函数只能处理字符串 当传入的是数组的时候就返回false 从而绕过die函数 这时intval接收

    2024年01月20日
    浏览(41)
  • ctfshow-web3

    CTF 加解密合集 CTF Web合集 这个题目一看就知道是一个文件包含漏洞 php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。 所以就可以直接执行命令 发现一个ctf_go_go_go的文件,然后读取就是了 以上

    2024年02月15日
    浏览(35)
  • ctfshow--web入门--文件上传

    目录 ctfshow--web入门--文件上传 web151(前端校验) web152(content-type) web153(.user.ini) web154(内容检测\\\'php\\\') web155(内容检测\\\'php\\\') web156(内容检测\\\'[\\\') web157(内容检测\\\'php\\\'\\\'[]\\\'\\\'{}\\\'\\\';\\\') web158(文件检测\\\'php\\\'\\\'{\\\'\\\'[\\\'\\\';\\\'\\\'log\\\') web159(日志包含) web160(日志空格检测) web161(日志文件头检测) web162web163(session包含) w

    2024年02月14日
    浏览(32)
  • CTFShow-Web入门

    web1 解题思路: 查看源代码 web2 解题思路: 在无法查看源代码的情况下可以使用快捷键 web3 解题思路: 查看源代码无效,尝试发送POST请求 web4 解题思路: 根据题目提示: 总有人把后台地址写入robots,帮黑阔大佬们引路。 找到了flag的路径 web5 解题思路: 根据题目提醒phps源码泄露,访

    2024年02月12日
    浏览(35)
  • ctfshow-web14

    CTF 加解密合集 CTF Web合集 首先看到这个,swith,那么直接输入4,则会打印$url的值 然后访问一下 查看一下,发现完整的请求是http://c7ff9ed6-dccd-4d01-907a-f1c61c016c15.challenge.ctf.show/here_1s_your_f1ag.php?query=1 查看注释,发现还有一些内容被处理了: 首先先测试注入,发现是数字型的,

    2024年02月11日
    浏览(31)
  • ctfshow愚人杯web复现

    题目url base64解码是 face.png ,尝试 flag.txt 和 flag.php ,base64加密后传入都不对,用 index.php 加密后传入,看源码 将后面的base64解密得到flag 源码 先看怎么传参 这一句话的意思是接收header头中 aaaaaa参数的值,就例如这样的 然后提示说有一个txt,但不知道名字是什么,想办法读取

    2023年04月09日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包