目录
做该靶场的一些函数:
一:highlight_file(__FILE__);
1:在php中,highlight_file(__FILE__)的作用是以语法高亮的形式去输出当前php文件代码,会把整个页面的内容都显示出来。
highlight_file这是 PHP 提供的一个函数,用于输出文件的内容,并对 PHP 代码部分进行语法高亮。会直接将输出内容返回到浏览器。
(__FILE__):它返回当前脚本文件的完整路径和文件名。本文件高亮。
如果在包含文件中使用,它返回被包含文件的路径。
如果在主脚本中使用,它返回主脚本的路径。
2:当我把这串代码给注释掉的时候,整个页面就看不到任何东西了。 highlight_file(__FILE__)
是唯一负责显示页面内容的部分,高亮文件是用来显示后端处理的源代码的,如果没有这部分的话就看不到php源码了。
3:highlight_file( $filename, $return )后面那个参数是可以没有的。可以包含其他文件,也可以是本文件。
后面那个参数是返回值,如果返回值是false那么就会显示文件的内容(没有的时候默认是它),返回值是true,则不会显示页面的内容
二:preg_match正则匹配
该函数是 PHP 中的一个正则表达式函数,用于执行模式匹配,也就是用正则表达式在字符串中查找是否存在匹配的部分。其返回值是布尔类型。
int preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)
1:pattern:正则表达式的模式。(满足条件)
必须以 /
包围(或者其他界定符),可以包含正则表达式修饰符,如 i
、u
等
i和m等修饰符的区别是i是忽略了大小写。m是多行匹配的意思。%0a在url里面是换行的意思。
让正则表达式的 ^
和 $
分别匹配行的开头和行的结尾,而不仅仅是整个字符串的开头和结尾。
s
(单行模式,也称为 PCRE_DOTALL
): 在单行模式下,.
字符匹配任何字符,包括换行符。
m
(多行模式): 在多行模式下,^
和 $
分别匹配每行的开始和结束位置,而不仅仅是整个字符串的开始和结束位置。
2:subject要搜索的目标字符串。 则本身的/就是/\这么表示了
剩下的都是可选项,上面的是必选项。
3: $matches
(可选):
如果提供了这个参数,preg_match()
会将第一个匹配的结果存储在该数组中。
$matches[0]
保存完整匹配的字符串。
$matches[1], $matches[2]
等保存第一个、第二个捕获组的内容。
4:$flags
提供额外的选项,如 PREG_OFFSET_CAPTURE
(返回匹配位置)
5:$offset
(可选):
开始搜索的位置(默认从字符串的开头)。
if(preg_match("/a/","qwertayuio")){ //匹配字串中是否包含a字符
if(preg_match("/(abc)/","qwerta bcayuio")){ //匹配字串中是否包含abc字串
if(preg_match("/[abc]/","qwertbycuiop")){ //匹配字串中是否包含a、b或c字字符 if(preg_match("/[0-9]/","qwertbycuiop")){ //匹配字串中是否包数字
if(preg_match("/[a-z]/","12345a6789")){ //匹配字串中是否包小写字母
if(preg_match("/[0-9]{2}/","qwe89rqw9re8qwer",$a)){ //匹配字串中是否包两位的数字
if(preg_match("/[0-9]{2,}/","qwe12rqw9re8qwer",$arr)){ //匹配字串中是否包至少两位的数字
if(preg_match("/[0-9]{2,4}/","qwe12567rqw9re8qwer",$arr)){ //匹配字串中是否包至少两位到4位的数字
if (!preg_match("/\;/", $v2)) 检查是否含义分号。
很多匹配规制:在php正则表达式_php 正则 [0-9][a-z]-优快云博客php正则表达式_php 正则 [0-9][a-z]-优快云博客
6: die()
会输出该消息,然后终止脚本的执行。所以在第一关中,die就可以让下面的代码无法执行,从而实现过滤。
三:intval()函数:
int intval( $var, $base )
$var:需要转换成 integer(整型) 的「变量」
$base:转换所使用的「进制」
返回值可以是整数,也可以是一个布尔类型:
0:失败 或 空array 返回 0
1:非空array 返回 1
其他integer值:成功时 返回 $var 的 integer 值。(返回值是一个整数,如果不是整数会尽力转会为整数,如果转换不了整数,那么就返回值就是0)
1:进制自动转换:
当第2个参数为空的时候是默认的是十进制,输入什么数字就是什么数字。
值为0x是16进制,值为0的时候是八进制。
就是输入的是进制数字,然而输出的是int 的十进制类型的数字。
2:数组转换:
空数组返回值是0,非空数组返回值1
3:转换小数,返回小数的整数部分。
4:判断字符串开头是否是数字,是数字就输出数字,是字母就输出布尔值0
5:取反~~,反2下就是原来的数字。
6:浮点数精度损失,进行算数运算。
1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5。
原文:https://blog.youkuaiyun.com/wangyuxiang946/article/details/131156104
四:strpos函数:
strpos定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
注释:strpos() 函数对大小写敏感。
stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)。
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
。 无i区分,多加r是最后。
strpos(string,find,start) (这几个函数的用法都是一样的,参数一样)
第一个(必填)规定要查找的字符串。
第二个(必填)规定查找什么。
第三个(选填)从哪里开始。相当于索引从0开始。
如果没有找到就返回0。找到位置就返回该
返回找到的位置的索引,如果是在一个长的字符串中找子字符串,就返回该子字符串的第一个位置的索引。
web89:
1:正则表达式中,不让含有数字,如果含有数字了,那么就会die,使得整个代码就中断了。所以就不可以用数字了。
2:就考虑用数组绕过,就num变成一个数组就可以。返回布尔值类型为1.
3:只担心数组会不会有元素get传参数?num[]
web90
0指的是八进制数字,让$num=4476的八进制的时候可以绕过前面的4476,也可以满足后面的条件。
web91
多行和单行前面已经介绍了。%0a是url里面的换行符。
cmd=php%0aphp
如果单行匹配的时候,存在第2行有东西的时候,也不满足正则匹配。
多行匹配的时候只要有一行满足条件就可以。只有php这样一个内容。
web92
intal()这个函数会根据进制进行自动转换,不必在意后面那个参数了。
1:看源码传num为4476的八进制数字就可以了。也可以16进制去绕过。
2:小数取整的方法也可以4476.1.
web93
该源代码过滤了字母就不能用16进制去绕过了。所以八进制,小数点仍然可以在这里使用。
web94
1:这个函数在上面已经介绍过了。!取反就是看它的位置返回布尔值的取反。所以第一个如果是0,返回值为0,取反是1,那么就执行die。所以就要让0出现在不是第一的位置就行,而且要保证后面8进制转换的数字是10574.
2:或者是4476.01等让它找到0返回错误,并且取整之后还是4476.
web95
preg_match("/[a-z]|\./i")
匹配字母或者点 \.是匹配.的意思。就是表明不能使用小数了。
%20在url编码是空格的意思。
%2b在url里面是加号的意思,加一些预制符,让它认为0不在不在下表为0的地方就可以。
加一些在url没有什么实际影响的符号。空格 Tab +
web96
还是高亮文件,高亮文件包含flag.php文件就可以了,但是上面把php这个文件得过滤掉了,相当于upload-labs靶场,改下大小写,加.加空格等等。
?u=flag.php+
web97
php中===不仅会比较数字是否相同,也会比较数据类型是否相同。
不同的数字(或任何不同的数据)通过 MD5 加密后有可能生成相同的 MD5 值,这种现象被称为哈希碰撞(Hash Collision)。
虽然 MD5 设计初衷是防止碰撞,但它已被破解,存在多种已知的碰撞对。
1:a = 240610708 & b = QNKCDZO
2:在 PHP 中,如果将数组作为参数传递给 md5()
函数,会导致错误,或者返回 NULL
(空值)。空值就相等了。这背后的原因与 md5()
函数的设计以及 PHP 的类型处理方式有关。md5只能接受字符串类型的数字。a[]=1 & b[]=4
post传参就用hacker传就可以了,记得&。
web98
php中的三目运算符
1:条件 ? 表达式1 : 表达式2;
$result = $condition ? $value1 : $value2; 条件为真的时候value的值就被赋予给result。
2:$_GET = &$_POST
表示将$_GET
数组的引用赋值给$_POST
数组。
在PHP中,&
符号用于获取变量的地址,即获取变量的引用。当你在PHP中使用$_GET = &$_POST
时,你实际上是将$_POST
数组的引用赋值给了$_GET
。这意味着$_GET
和$_POST
将指向同一个数组,任何对其中一个数组的修改都会影响到另一个数组。
分析第一行代码:如果你get传参的话,post传参的值会给get。如果你不是get传参的话,就是字符串flag。
1:这样就出现了第一中绕过(高亮文件上面已经介绍过了):让浏览器知道你get传参就行了,不管传上面,传的空都可以。
2:cookie绕过,修改cookie的值自动拼接。
3:修改请求头
web100:
php new函数用于将对象实例化。
new
是一个关键字,用于创建类的实例。
创建对象时会调用类的构造函数。// 定义一个简单的类
// 定义一个简单的类
// 定义一个简单的类
class MyClass {
public $property;
public function __construct($value) {
$this->property = $value;
}
public function display() {
echo "Property: " . $this->property;
}
}
// 使用 new 关键字创建 MyClass 的实例
$object = new MyClass("Hello, World!");
// 调用对象的方法
$object->display(); // 输出: Property: Hello, World!
-
定义类 :首先,我们定义了一个名为
MyClass
的类,它有一个属性$property
和一个构造函数__construct
。构造函数会在创建对象时自动调用,并可以接收参数来初始化对象的属性。(感觉相当于函数的调用) -
创建对象 :使用
new
关键字创建MyClass
的实例。这会调用MyClass
的构造函数,将"Hello, World!"
作为参数传递给构造函数,从而初始化$property
属性。 -
调用方法 :通过对象
$object
调用display
方法,输出$property
的值。
eval
函数的主要用途是将字符串作为 PHP 代码来执行。
$code = 'echo "Hello, World!";';
eval($code); // 输出: Hello, World!
在 PHP 中,is_numeric
是一个内置函数,用于检查给定的变量是否为数字或者数字字符串。(整型浮点型,加冒号的数字)
~如果变量是数字或者数字字符串,返回 true
。
~否则,返回 false
。
这行代码尝试检查v1、v2 和 $v3 是否都是数字。由于 PHP 中逻辑运算符的优先级,它实际上只检查了 $v1 是否为数字
然后进行拼接php语句就可以了。
使用printf_r也可以
不可以用echo进行拼接,它出现了报错提示。