[关闭]
@1kbfree 2018-05-08T16:36:16.000000Z 字数 6964 阅读 10816

PHP函数使用笔记

代码审计


不显示错误信息:error_reporting(0)

文件包含函数:include()、include_once()、require()、require_once()

开启session:session_start()

是否开启了gpc功能:if( !get_magic_quotes_gpc() ){}

过滤函数:addslashes()入敏感的内容会被转义(\)


等号用处分类:

  1. 1、=:赋值,在逻辑运算时也有效;
  2. 2、==:等于运算,但是不比较值的类型;
  3. 3、===:完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真。

const用法:

  1. <?php
  2. const name='iamfree';
  3. echo name;
  4. /*
  5. 输出:iamfree
  6. */
  7. ?>

htmlspecialchars()函数:
image_1cavlibuatcrb7u1qbv6ni1p9.png-17.3kB

执行转换:

字符 替换后
& (& 符号) &amp;
" (双引号) &quot;,除非设置了 ENT_NOQUOTES
' (单引号) 设置了 ENT_QUOTES 后, ' (如果是 ENT_HTML401) ,或者 ' (如果是 ENT_XML1、ENT_XHTML 或 ENT_HTML5)。
< (小于) &lt
> (大于) &gt

extract()函数:
image_1cb2cblp6lpb19ku1ouu4d81h701t.png-32.2kB


parse_str():

  1. <?php
  2. parse_str('name=iamfree'); //把name变成变量名,iamfree变成变量值
  3. echo $name;//输出iamfree
  4. ?>

import_request_variables():

此函数把GET、POST、COOKIE的参数注册为变量,一般不建议开启

注意,只在 PHP4.1PHP5.4之间可用

  1. <?php
  2. $name = 'whoami';
  3. import_request_variables('GP'); //G表示GET、P表示POST如果有C表示COOKIE;这里的GP表示注册GET和POST请求的参数为变量
  4. echo $name;
  5. ?>

效果:

image_1cckvkb6b186c6g11p8ojf4lbd9.png-54.1kB

array_key_exists():

  1. array_key_exists ( $key , $array )

数组里有键 key 时,array_key_exists() 返回 TRUE。 key 可以是任何能作为数组索引的值。

image_1cba1lh3okkkg0n1qkp1uuc104v9.png-16.1kB


str_ireplace过滤sql语句:
str_ireplace.png-816.7kB
此函数用法:
str_ireplace用法.png-6.4kB
将 whoami? 中的 whoami 被 iamfree 替换,也就是说把whoami?里的whoami替换成iamfree所以结果就是iamfree?

这里其实是可以绕过的,比如:
image_1caugtd8fj54ke9tf112cr1qbl4h.png-150.2kB


变量覆盖:
image_1cbrhvola1igmjhm15mc1rsqed816.png-33.4kB
image_1cbri0lsa1tuc1erh1d5q1drsdre1j.png-70.7kB

难一点的:

  1. <?php
  2. foreach (array( '_GET','_POST' ) as $key => $value) {
  3. foreach ($$value as $_key => $_value){
  4. echo $_key.':'.$_value;
  5. echo "<br >";
  6. }
  7. }
  8. ?>

执行后的结果:
image_1ccl9ivq22vk1pdat631f7oq8s1g.png-32.5kB


define()用法:

  1. <?php
  2. define('t',time()); //把time()的返回值定义为常量(t)
  3. echo t;
  4. ?>

image_1ccl95vnr10rv1el118e91bdl155m13.png-73.9kB

三元表达式:

  1. <?php
  2. $name = !empty($_GET['name']) ? $_GET['name'] : '此人无名'; //表示如果$_GET['name']不为空的话就返回$_GET['name']如果为空就返回 此人无名。
  3. echo $name;
  4. ?>

还可以有一种判断方法:

  1. <?php
  2. echo 1;
  3. isset($_GET['name']) && exit('exit'); //如果isset($_GET['name'])为真也就是name这个参数存在的时候,会执行exit('exit'),相反,不存在的时候不会执行exit('exit')
  4. echo 2;
  5. ?>

name参数不存在时:
image_1ccl8dgoon1s7l1i4d2bh2449.png-46.7kB

name参数存在时:
image_1ccl8eog3koq1oa41g4210elf3sm.png-68.8kB


nl2br()函数:
image_1cbrhga1o1i0t1vnl2611jojbkip.png-22.5kB


eval()函数:

  1. 代码
  2. <?php
  3. $string = 'cup';
  4. $name = 'coffee';
  5. $str = 'This is a $string with my $name in it.';
  6. echo $str. "\n";
  7. eval("\$str = \"$str\";");
  8. echo $str. "\n";
  9. ?>

输出:
This is a $string with my $name in it.
This is a cup with my coffee in it.


explode()函数:

也就是拆分

image_1ca61lt671266hda1loq1om3gr411.png-28.6kB


copy()函数:

copy(source,destination)

参数 描述
source 必需。规定要复制的文件。
destination 必需。规定复制文件的目的地。

将文件从 source 拷贝到 destination。如果成功则返回 TRUE,否则返回 FALSE。


trim()函数:
移除字符串两侧的空格等特殊字符
移除字符串两侧的空格等特殊字符.png-14.7kB


strcasecmp()函数:
image_1calh2fsf1pjn50b1nh11h0v1v3d9.png-39.5kB


正则表达式:

preg_match()函数:
preg_match函数的参数介绍

匹配一下i
image_1cb2e316g1k9mdevmb11v3v15sm2a.png-16.9kB
*这里的//是定界符 ,之需要二处字符一样就可以,比如== -- ?? 等等 但是有些不能做定位符 比如a到z、A到Z、0到9、空格、*

匹配全部英文字母(包括大写):
image_1cb2e8ben2u160k1kuktn1n792n.png-33kB

替换匹配到的内容:
image_1cb2ej8kv1l2loph4hd2480l3h.png-20kB


define()函数:
image_1cau24b5jgimn6h6ge7sd8u19.png-19.7kB

  1. define(name,value,case_insensitive)
参数 描叙
name 必需。规定常量的名称。
value 必需。规定常量的值。
case_insensitive 可选。规定常量的名称是否对大小写敏感。

若设置为 true,则对变量名大小写不敏感。默认是 false(大小写敏感)。


dirname()函数:
image_1cau2i80e2ag1rp5a721pak1ku4m.png-39.5kB
dirname(path)

参数 描述
path 必需。规定要检查的路径。

该函数返回去掉文件名后的目录名


iconv()函数:
image_1cau44qdgb61h0u119k11ok1rda1g.png-60.5kB
iconv ( in_charset , out_charset , str )
将字符串 str 从 in_charset 转换编码到 out_charset。

intval()函数:
image_1calj80va17dali6obj1bsj1371n.png-70.2kB
还可以当防止SQL注入:
image_1cartbh4v1thh1egn1iga1fcinu1g.png-14.6kB


reset()函数:
image_1camn387gtjs1pj6imq18fmoap.png-57.2kB


$$变量覆盖:
image_1campm57rug6ul5e76u4h1ij216.png-36.5kB

还有一个很有趣的:

  1. <?php
  2. $g = '_GET';
  3. $g = $$g; //这个时候$$g的第二个$与$g的值拼接了变成了$_GET,第一个$变成了$g,所以$g=$_GET
  4. echo $g['name'];
  5. ?>

image_1cckvtnv0fkgv9volmk581ue5m.png-62.9kB


isset()函数:检测变量是否已设置并且非 NULL
unset()函数:释放给定的变量


parse_ini_file() 解析一个配置文件。

  1. array parse_ini_file ( string $filename [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL ]] )

载入一个由 filename 指定的 ini 文件,并将其中的设置作为一个联合数组返回。

参数 用法
filename 要解析的 ini 文件的文件名。
process_sections 如果将最后的 process_sections 参数设为 TRUE,将得到一个多维数组,包括了配置文件中每一节的名称和设置。process_sections 的默认值是 FALSE。
scanner_mode Can either be INI_SCANNER_NORMAL (default) or INI_SCANNER_RAW. If INI_SCANNER_RAW is supplied, then option values will not be parsed.

返回值: 成功时以关联数组 array 返回设置,失败时返回 FALSE。


urldecode()函数,可能会造成urldecode二次注入:
image_1cao633k6105ecv99s4pre14129.png-32.1kB


$_FILES用法:
image_1cb241vvp1ls511el1umg44v1oqi9.png-42.7kB

image_1cb242979174ttbvod71k31e97m.png-43.3kB

image_1cb2494dpm70155kdea1i1217um13.png-117.7kB


is_numeric()函数:

判断是否为数字,是返回1,不是返回空

image_1cao6u6q0cd76121e244i910gm.png-24.7kB


dvwa的sql注入的impossible等级源码(dvwa的impossible不存在sql注入):
image_1cao7j7051cek133f1oku1ek51vc13.png-47.7kB
当然 我看不懂这几行:

  1. $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
  2. $data->bindParam( ':id', $id, PDO::PARAM_INT );

substr()函数:

  1. <?php
  2. $rest = substr("abcdef", -1); // 返回 "f"
  3. $rest = substr("abcdef", -2); // 返回 "ef"
  4. $rest = substr("abcdef", -3, 1); // 返回 "d"
  5. $rest = substr("abcdef", 0, -1); // 返回 "abcde"
  6. $rest = substr("abcdef", 2, -1); // 返回 "cde"
  7. $rest = substr("abcdef", 4, -4); // 返回 ""
  8. $rest = substr("abcdef", -3, -1); // 返回 "de"
  9. ?>

strrpos()函数:

  1. <?php
  2. $foo = "0123456789a123456789b123456789c";
  3. var_dump(strrpos($foo, '7', -5)); // 从尾部第 5 个位置开始查找
  4. // 结果: int(17)
  5. var_dump(strrpos($foo, '7', 20)); // 从第 20 个位置开始查找
  6. // 结果: int(27)
  7. var_dump(strrpos($foo, '7', 28)); // 结果: bool(false)
  8. ?>

extract()函数:
image_1capb8b1l16th19ectna124m6sp9.png-46.6kB


常见语法:

  1. if(empty($a)) $a = 'hello world'; //如果$a为空,那么它的值为hello world
  1. $s = 'sys'.'tem';
  2. $s('whoami'); //返回desktop-a0iqkh2\iamfree
  3. /*这里就是执行了whoami的命令*/

匿名函数:

  1. $C_F = create_function('$name','return $name;'); //$name的位置是传递什么参数,第二个参数是函数里执行什么代码
  2. echo $C_F('iamfree'); //输出iamfree

回调函数:

  1. function Func($name){
  2. echo "hello $name";
  3. }
  4. call_user_func('Func','iamfree');
  5. /*输出:hello iamfree*/
  1. call_user_func('system','whoami');
  2. /*输出:desktop-a0iqkh2\iamfree*/

命令执行函数:

image_1carr8bt51nu8inj1ovq1b3nai79.png-42.6kB


文件操作函数:

任意文件读取、写入、删除往往是上面几个函数受到了控制(当然还有其他的函数)。
不同的函数在不同的场景有不同的作用和不同的利用手法。
读取:可以读取配置等文件,拿到key
写入:可以写入shell代码相关的内容
删除:可以删除.lock文件而可以重新安装覆盖

image_1carrl00k1f4isqn1kthuu9o4rm.png-389.2kB


特殊函数

信息泄漏

bool phpinfo ([ int $what = INFO_ALL ] )
输出 PHP 当前状态的大量信息,包含了PHP编译选项、启用的扩展、PHP版本、服务器信息和环境变量(如果编译为一个模块的话)、PHP环境变量、操作系统版本信息、path变量、配置选项的本地值和主值、HTTP头和PHP授权信息(License)。

软连接-读取文件内容

bool symlink ( string $target , string $link )
symlink() 对于已有的 target 建立一个名为 link 的符号连接。
string readlink ( string $path )
readlink() 和同名的 C 函数做同样的事,返回符号连接的内容。

环境变量

string getenv ( string $varname )
获取一个环境变量的值。
bool putenv ( string $setting )
添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

加载扩展

bool dl ( string $library )
载入指定参数 library 的 PHP 扩展。

配置相关
string ini_get ( string $varname )

成功时返回配置选项的值。

  1. string ini_set ( string $varname , string $newvalue )
  2. string ini_alter ( string $varname , string $newvalue )

设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。
void ini_restore ( string $varname )
恢复指定的配置选项到它的原始值。

数字判断
bool is_numeric ( mixed $var )
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。
仅用is_numeric判断而不用intval转换就有可能插入16进制的字符串到数据库,进而可能导致sql二次注入。

数组相关
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。
该函数有一个特性,比较之前会进行自动类型转换。
in_array($str,$arr)判断$str是否在$arr数组里
image_1cartm29n1seoieq1o52b2qbn72d.png-28.9kB

变量覆盖

如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域:
void parse_str ( string $str [, array &$arr ] )
本函数用来将变量从数组中导入到当前的符号表中。检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突:
int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] )

bool mb_parse_str ( string $encoded_string [, array &$result ] )
解析 GET/POST/COOKIE 数据并设置全局变量。 由于 PHP 不提供原始 POST/COOKIE 数据,目前它仅能够
用于 GET 数据。 它解析了 URL 编码过的数据,检测其编码,并转换编码为内部编码,然后设置其值为 array
的 result 或者全局变量。
bool import_request_variables ( string $types [, string $prefix ] )
GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变
量,那么此函数就很有用。

  1. <?php
  2. $str = "first=value&arr[]=foo+bar&arr[]=baz";
  3. // 推荐用法
  4. parse_str($str, $output);
  5. echo $output['first']; // value
  6. echo $output['arr'][0]; // foo bar
  7. echo $output['arr'][40]; // baz
  8. // 不建议这么用
  9. parse_str($str);
  10. echo $first; // value
  11. echo $arr[0]; // foo bar
  12. echo $arr[1]; // baz
  13. ?>

列目录

array glob ( string $pattern [, int $flags = 0 ] )
glob() 函数依照 libc glob() 函数使用的规则寻找所有与 pattern 匹配的文件路径,类似于一般shell所用的规则一样。不进行缩写扩展或参数替代。
image_1caru9aiu1a5v1qr2p7m1pjlpjq2q.png-46.9kB
var_dump(glob('c*.php')); //列出c开头的PHP文件

无参数获取信息

返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量:
array get_defined_vars ( void )
返回当前所有已定义的常量名和值。 这包含 define() 函数所创建的,也包含了所有扩展所创建的:
array get_defined_constants ([ bool $categorize = false ] )
返回一个包含所有已定义函数列表的多维数组:
array get_defined_functions ( void )
返回所有被 include、 include_once、 require 和 require_once:
array get_included_files ( void )

image_1carv1gbf9am1c0rnic1gs9156f37.png-218.1kB


rand()函数:
image_1carsup0fqrg1uipj1q1oeb1okv13.png-29.6kB


$_REQUEST用法:
image_1cb26fq2i1upk16alpd18eb8pg1g.png-30kB


file_exists()函数:
检查文件或目录是否存在
image_1cauetnlg17n874k1qqf11suk537.png-34.8kB


exit用法:
image_1caufp0at1lt18k71uqkhg51eab3k.png-181.2kB
多处用在install.php里,因为成功安装一次之后就能再一次运行安装了,除非将exit删除了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注