CTF -php方面

php ———魔术方法小结1

  1. php的特性,当序列化后对象的参数列表中成员个数和实际个数不符合时会绕过 __weakup();
  2. 构造方法 / __construct 当类被实例化的时候就会调用 简单来说,就是 new 一个类的时候,这个方法就会自动执行
  3. 析构方法 / __destruct 当类被销毁时候自动触发 可以使用 unset 方法触发该方法
  4. 克隆方法 / __clone 当类被克隆时自动会自动调用
  5. 非静态调用方法 / __call 当要调用的方法不存在或者权限不足时候会自动调用 比如我在类的外部调用类内部的 private 修饰的方法
  6. 静态调用方法 / __callStatic 当要调用的静态方法不存在或者权限不足时候会自动调用 比如我在类的外部调用类内部的 private 修饰的静态方法
  7. 打印方法 / __debugInfo 该方法会在 var_dump() 类对象时候被调用 如果没有定义该方法,var_dump() 将会打印出所有的类属性
  8. 获取成员属性 / __get 通过它可以在对象外部获取私有成员属性
  9. 获取不可访问属性 / __isset 当对不可访问的属性调用 isset() 或则会 empty() 时候会被自动调用
  10. 属性赋值 / __set 给一个未定义的属性赋值时候会被触发
  11. 调用对象本身 / __invoke 对象本身不能直接当函数用 如果对象被当作函数调用就会触发该方法
  12. 序列化调用 / __sleep 当在类的外部调用 serialize() 时会自动被调用
  13. 反序列化调用 / __wakeup 当执行 unserialize() 方法时会被自动调用
  14. 反序列化调用 / __wakeup 当执行 unserialize() 方法时会被自动调用
  15. 删除调用 / __unset 当对不可访问的属性调用 unset() 时会被自动调用

php ———魔术方法小结2

PHP中的魔术方法总结 :

construct, destruct , call, callStatic,get, set, __isset,

unset , sleep, wakeup, toString, set_state, clone and __autoload

  1. get、set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 get( $property ) 当调用一个未定义的属性时访问此方法 set( $property, $value ) 给一个未定义的属性赋值时调用 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
  2. isset、unset isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法 unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法 与get方法和set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
  3. call call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求 这里的未定义的方法包括没有权限访问的方法
  4. autoload autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。 注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。
  5. construct、destruct construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称 destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法 默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源. 析构函数允许你在使用一个对象之后执行任意代码来清除内存. 当PHP决定你的脚本不再与对象相关时,析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
  6. clone PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用clone魔术方法 如果在对象复制需要执行某些初始化操作,可以在__clone方法实现
  7. toString toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时 如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in 此方法必须返回一个字符串 在 PHP 5.2.0之前,toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字 符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义 toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。
  8. sleep、wakeup sleep 串行化的时候用 wakeup 反串行化的时候调用 serialize() 检查类中是否有魔术名称 sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。 使用 sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。 相反地,unserialize() 检查具有魔术名称 wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。 使用 wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
  9. __set_state 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。 本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
  10. invoke 当尝试以调用函数的方式调用一个对象时,invoke 方法会被自动调用。 PHP5.3.0以上版本有效
  11. callStatic 它的工作方式类似于 call() 魔术方法,callStatic() 是为了处理静态方法调用, PHP5.3.0以上版本有效 PHP 确实加强了对 callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

RCE漏洞做题记录

[SWPUCTF 2021 新生赛]finalrce

注意被过滤的字符, 可以用注释符(\)绕过某些字符限制, 无回显时tee可以将内容写入为文件,方便无回显时查看 2024/2/17 15:27

PHP伪协议做题记录

[ZJCTF 2019]NiZhuanSiWei

注意: 当出现:file_get_contents(()函数时可用 data://text/plain,+内容 绕过 2024/2/25 19:57

供使用知识点

file://

作用:用于访问文件(绝对路径、相对路径、网络路径)

示例:

http://www.xx.com?file=file:///etc/passswd

php://

作用:访问输入输出流

  1. php://filter

作用:读取源代码并进行base64编码输出

示例:http://127.0.0.1/cmd.php?cmd=php://filter/read=convert.base64-encode/resource=[文件名](针对php文件需要base64编码)

参数: resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流 read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 <;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

  1. php://input

作用:执行POST数据中的php代码

示例:http://127.0.0.1/cmd.php?cmd=php://input

POST数据:<?php phpinfo()?>

注意: enctype="multipart/form-data" 的时候 php://input 是无效的

data://

作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般需要用到base64编码传输

示例:http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

常见网站备份的文件后缀

.index.php.swp index.php.swp index.php.bak .index.php~ index.php.bak_Edietplus index.php.~ index.php.~1~ index.php index.php~ index.php.rar index.php.zip index.php.7z www.rar www.zip www.rar www.zip www.7z www.tar.gz www.tar web.tar web.rar web.zip web.7z web.tar.gz web.tar wwwroot.rar web.rar

[GDOUCTF 2023]泄露的伪装

由题目可知源码泄露,常用备份后缀挨个尝试后得到/www.rar下载源码打开

2024/2/25 22:56

[BJDCTF 2020]easy_md5

由题考点为MD5强弱碰撞 2024/2/26 21:38

sql md5 绕过万能密码

  • ffifdyop
  • 129581926211651571912466741651878684928

MD5强碰撞

HEX样本A d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70

两段数据的MD5均为: 79054025255fb1a26e4bc422aef54eb4

HEX样本B 4dc968ff0ee35c209572d4777b721587 d36fa7b21bdc56b74a3dc0783e7b9518 afbfa200a8284bf36e8e4b55b35f4275 93d849676da0d1555d8360fb5f07fea2

4dc968ff0ee35c209572d4777b721587 d36fa7b21bdc56b74a3dc0783e7b9518 afbfa202a8284bf36e8e4b55b35f4275 93d849676da0d1d55d8360fb5f07fea2

两段数据的MD5均为: 008ee33a9d58b51cfeb425b0959121c9

HEX样本C 0e306561559aa787d00bc6f70bbdfe34 04cf03659e704f8534c00ffb659c4c87 40cc942feb2da115a3f4155cbb860749 7386656d7d1f34a42059d78f5a8dd1ef

0e306561559aa787d00bc6f70bbdfe34 04cf03659e744f8534c00ffb659c4c87 40cc942feb2da115a3f415dcbb860749 7386656d7d1f34a42059d78f5a8dd1ef

两段数据的MD5均为: cee9a457e790cf20d4bdaa6d69f01e41

    • d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70 and

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70 produce an MD5 collision.

Each of these blocks has MD5 hash 79054025255fb1a26e4bc422aef54eb4

md5函数无法处理数组!会返回null!

md5强碰撞样本

array1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB%07%FE%A2&array2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB%07%FE%A2

sha1强碰撞样本

array1=%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&array2=%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

非法传参类

在php中变量名字是由数字字母和下划线组成的,所以不论用post还是get传入变量名的时候都将空格、+、点、[转换为下划线,但是用一个特性是可以绕过的,就是当[提前出现后,后面的点就不会再被转义了,such as:CTF[SHOW.COM=>CTF_SHOW.COM

create_function()问题

适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 从php7.2.0后被废弃

php被过滤函数

preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|$|*|+|\^|scan|.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$code) 其中 \ 未被过滤

PHP文件后缀

.php4 .php5 .phtml .phpx .jpg.php 1.php/. .htaccess .user.ini pht, phpt, phtml, php3,php4,php5,php6

正则绕过

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){ exit("hacker :)"); }

这个正则的绕过方法就是利用特性来绕过,可以用

  • [
  • (空格)
  • .

上面那几个字符任何一个都行,都可以被处理成_


if (preg_match('/utils.php\/*$/i', $_SERVER['PHP_SELF'])) { exit("hacker :)"); }

这个正则是匹配末尾有没有utils.php/

绕过办法很简单

因为后面要调用basename,所以可以利用中文来绕过,中文不属于ascii编码中的

$_SERVER['PHP_SELF']

这个是你调用的脚本的路径

比如说这个题目它的值就是/index.php

如果你访问的是

http://1.14.71.254:28189/index.php/utils.php

那么它的值就会是/index.php/utils.php

而$_SEVER['REQUEST_URL']

它的值这个时候和$_SERVER['PHP_SELF']的值是一样的,

区别在于,如果你用get传参的时候$SEVER['REQUEST_URL']是会加上那个参数的,而$SERVER['PHP_SELF']不会。

做js代码审计的技巧

翻页 搜索关键字:flag、.php、alert 拿到jsfuck码后到控制台 打印出来

反序列化 以及构造pop链

  • 反序列化(serialize)时不会触发construct()函数! 但是会触发destruct()函数!! 反序列化所要触发的wakeup需要在该class里边 ,如该class对象里边无uwakeup类则无法触发。。 即:魔术方法触发前提:魔术方法所在的类或对象被调用。
  • invoke触发条件:把对象当成函数

contant-type类型

常见的媒体格式类型如下:

text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式

以application开头的媒体格式类型 application/xhtml+xml :XHTML格式 application/xml: XML数据格式 application/atom+xml :Atom XML聚合格式 application/json: JSON数据格式 application/pdf:pdf格式 application/msword : Word文档格式 application/octet-stream : 二进制流数据(如常见的文件下载) application/x-www-form-urlencoded : <form encType="">中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的: multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

表示本地访问

1 Client-IP:127.0.0.1 2 Forwarded-For-Ip: 127.0.0.1 3 Forwarded-For: 127.0.0.1 4 Forwarded-For: localhost 5 Forwarded:127.0.0.1 6 Forwarded: localhost 7 True-Client-IP:127.0.0.1 8 X-Client-IP: 127.0.0.1 9 X-Custom-IP-Authorization : 127.0.0.1 10 X-Forward-For: 127.0.0.1 11 X-Forward: 127.0.0.1 12 X-Forward: localhost 13 X-Forwarded-By:127.0.0.1 14 X-Forwarded-By: localhost 15 X-Forwarded-For-Original: 127.0.0.1 16 X-Forwarded-For-original: localhost 17 X-Forwarded-For: 127.0.0.1 18 X-Forwarded-For: localhost 19 X-Forwarded-Server: 127.0.0.1 20 X-Forwarded-Server: localhost 21 X-Forwarded: 127.0.0.1 22 X-Forwarded: localhost 23 X-Forwared-Host: 127.0.0.1 24 X-Forwared-Host: localhost 25 X-Host: 127.0.0.1 26 X-Host: localhost 27 X-HTTP-Host-Override : 127.0.0.1 28 X-Originating-IP: 127.0.0.1 29 X-Real-IP: 127.0.0.1 30 X-Remote-Addr: 127.0.0.1 31 X-Remote-Addr : localhost 32 X-Remote-IP: 127.0.0.1

一般可以全部复制进入报文包中,总有一个能绕过,表示本地访问

针对Linux系统绕过空格

cat${IFS}flag.txt cat$IFS$9flag.txt cat<flag.txt cat<>flag.txt ca\t fl\ag kg=$ '\x20flag.txt' &&cat$kg

    $IFS$9 (1-9)都可以

${IFS} 在这建议先用上面的过滤 因为下面的过滤方式有关键符号“ { } ”,很有可能被过滤掉

针对过滤很死的题目要依靠函数执行命令行不通了。那么命令执行我们就采用短标签+反引号。 ?><?= `nl /f*`?> 解释一下,<?=?>则是相当于<? echo>,payload最前面?>用于闭合,payload后面一部分相当于echo+反引号执行命令。

此作者没有提供个人介绍
最后更新于 2024-12-17