好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php挖洞基础知识篇(含防范方法) - 网站安全 - 自学

命令注入攻击

PHP中可以使用下列5个函数来执行外部的应用程序或函数

system、exec、passthru、shell_exec、[(与shell_exec功能相同)

函数原型

string system(string command, int &return_var)

command 要执行的命令

return_var 存放执行命令的执行后的状态值

string exec (string command, array &output, int &return_var)

command 要执行的命令

output 获得执行命令输出的每一行字符串

return_var 存放执行命令后的状态值

void passthru (string command, int &return_var)

command 要执行的命令

return_var 存放执行命令后的状态值

string shell_exec (string command)

command 要执行的命令

漏洞 实例

例1:

//ex1.php

<?php

$dir = $_GET["dir"];

if (isset($dir))

{

echo [<pre>];

system([ls -al [.$dir);

echo [</pre>];

}

?>

我们提交http://HdhCmsTest2cto测试数据 /ex1.php?dir=| cat /etc/passwd

提交以后,命令变成了 system([ls -al | cat /etc/passwd]);

eval注入攻击

eval函数将输入的字符串参数当作PHP程序代码来执行

函数原型:

mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候

//ex2.php

<?php

$var = [var];

if (isset($_GET["arg"]))

{

$arg = $_GET["arg"];

eval([\$var = $arg;]);

echo [\$var =].$var;

}

?>

当我们提交 http://HdhCmsTestsectop测试数据/ex2.php?arg=phpinfo();漏洞就产生了

动态函数

<?php

func A()

{

dosomething();

}

func B()

{

dosomething();

}

if (isset($_GET["func"]))

{

$myfunc = $_GET["func"];

echo $myfunc();

}

?>

程序员原意是想动态调用A和B函数,那我们提交http://HdhCmsTestsectop测试数据/ex.php?func=phpinfo 漏洞产生

防范方法

1、尽量不要执行外部命令

2、使用自定义函数或函数库来替代外部命令的功能

3、使用escapeshellarg函数来处理命令参数

4、使用safe_mode_exec_dir指定可执行文件的路径

esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号[’],替换成[\’],双引号[]],替换成[\]],分号[;]替换成[\;]

用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内

safe_mode = On

safe_mode_exec_di r= /usr/local/php/bin/

PHP漏洞全解(五)-SQL注入攻击

// 执行mysql查询语句

$query = [select * from postmessage where id = [.$_GET["id"];

$result = mysql_query($query)

or die([执行ySQL查询语句失败:] . mysql_error());

参数id传递进来后,和前面的字符串结合的sql语句放入 数据库 执行 查询

提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据

提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据

正常的SQL查询,经过我们构造的语句之后,形成了SQL注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。

防范方法

整型参数:

运用 intval函数将数据转换成整数

函数原型

int intval(mixed var, int base)

var是要转换成整形的变量

浮点型参数:

运用 floatval或doubleval函数分别转换单精度和双精度浮点型参数

函数原型

int floatval(mixed var)

var是要转换的变量

int doubleval(mixed var)

var是要转换的变量

字符型参数:

运用 addslashes函数来将单引号[’]转换成[\’],双引号[]]转换成[\]],反斜杠[\]转换成[\\],NULL字符加上反斜杠[\]

函数原型

string addslashes (string str)

str是要检查的字符串

那么刚才出现的代码漏洞,我们可以这样修补

// 执行mysql查询语句

$query = [select * from postmessage where id = [.intval($_GET["id"]);

$result = mysql_query($query)

or die([执行ySQL查询语句失败:] . mysql_error());

 

如果是字符型,先判断magic_quotes_gpc能无法 为On,当不为On的时候运用 addslashes转义特殊字符

if(get_magic_quotes_gpc())

{

$var = $_GET["var"];

}

else

{

$var = addslashes($_GET["var"]);

}

再次测试,漏洞已经修补

PHP 漏洞全解(九)-文件上传漏洞

一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件。

下面是一个简单的文件上传表单

<form action=]upload.php] method=]post] enctype=]multipart/form-data] name=]form1″>

<input type=]file] name=]file1″ /><br />

<input type=]submit] value=]上传文件] />

<input type=]hidden] name=]MAX_FILE_SIZE] value=]1024″ />

</form>

php的配置文件php.ini,其中选项upload_max_filesize指定允许上传的文件大小,默认是2M

$_FILES数组变量

PHP使用变量$_FILES来上传文件,$_FILES是一个数组。如果上传test.txt,那么$_FILES数组的内容为:

$FILES

Array

{

[file] => Array

{

[name] => test.txt                //文件名称

[type] => text/plain                //MIME类型

[tmp_name] => /tmp/php5D.tmp        //临时文件

[error] => 0                //错误信息

[size] => 536                //文件大小,单位字节

}

}

如果上传文件按钮的name属性值为file

<input type=]file] name=]file] />

那么使用$_FILES['file']['name']来获得客户端上传文件名称,不包含路径。使用$_FILES['file']['tmp_name']来获得服务端保存上传文件的临时文件路径

存放上传文件的文件夹

PHP不会直接将上传文件放到网站根目录中,而是保存为一个临时文件,名称就是$_FILES['file']['tmp_name']的值,开发者必须把这个临时文件复制到存放的网站文件夹中。

$_FILES['file']['tmp_name']的值是由PHP设置的,与文件原始名称不一样,开发者必须使用$_FILES['file']['name']来取得上传文件的原始名称。

上传文件时的错误信息

$_FILES['file']['error']变量用来保存上传文件时的错误信息,它的值如下:

文件上传漏洞

如果提供给网站访问者上传图片的功能,那必须小心访问者上传的实际可能不是图片,而是可以指定的PHP程序。如果存放图片的目录是一个开放的文件夹,则入侵者就可以远程执行上传的PHP文件来进行攻击。

下面是一个简单的文件上传例子:

<?php

// 设置上传文件的目录

$uploaddir = [D:/www/images/];

// 检查file是否存在

if (isset($_FILES['file1']))

{

// 要放在网站目录中的完整路径,包含文件名

$uploadfile = $uploaddir . $_FILES['file1']['name'];

// 将服务器存放的路径,移动到真实文件名

move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile);

}

?>

……

<form method=]post] enctype=]multipart/form-data] name=]form1″>

<input type=]file] name=]file1″ /><br />

<input type=]submit] value=]上传文件] />

<input type=]hidden] name=]MAX_FILE_SIZE] value=]1024″ />

</form>

这个例子没有检验文件后缀,可以上传任意文件,很明显的上传漏洞

查看更多关于php挖洞基础知识篇(含防范方法) - 网站安全 - 自学的详细内容...

  阅读:42次