ホームページ  >  記事  >  バックエンド開発  >  PHP の脆弱性について何を知っていますか? (詳しい紹介)

PHP の脆弱性について何を知っていますか? (詳しい紹介)

慕斯
慕斯オリジナル
2021-05-31 11:43:564044ブラウズ

针对PHP的网站主要存在下面几种攻击方式,这里介绍下,大家在书写php代码的时候一定要注意下,本篇文章有一定的参考性!

PHP の脆弱性について何を知っていますか? (詳しい紹介)

  • 针对PHP的网站主要存在下面几种攻击方式:
    命令注入(Command Injection)
    eval注入(Eval Injection)
    客户端脚本攻击(Script Insertion)
    跨网站脚本攻击(Cross Site Scripting, XSS)、SQL注入攻击(SQL injection)
    跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
    Session 会话劫持(Session Hijacking)
    Session 固定攻击(Session Fixation)
    HTTP响应拆分攻击(HTTP Response Splitting)
    文件上传漏洞(File Upload Attack)
    目录穿越漏洞(Directory Traversal)
    远程文件包含攻击(Remote Inclusion)
    动态函数注入攻击(Dynamic Variable Evaluation)
    URL攻击(URL attack)
    表单提交欺骗攻击(Spoofed Form Submissions)
    HTTP请求欺骗攻击(Spoofed HTTP Requests)

    命令注入攻击
    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 class="brush:php;toolbar:false">";
        system("ls -al ".$dir);
        echo "
"; } ?>

我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd
提交以后,命令变成了 system("ls -al | cat /etc/passwd");

PHP の脆弱性について何を知っていますか? (詳しい紹介)

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://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了

动态函数

<?php func A()
{
        dosomething();
}
func B()
{
        dosomething();
}
if (isset($_GET["func"]))
{
        $myfunc = $_GET["func"];
        echo $myfunc();
}
?>


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

  • 防范方法
    尽量不要执行外部命令
    使用自定义函数或函数库来替代外部命令的功能
    使用escapeshellarg函数来处理命令参数
    使用safe_mode_exec_dir指定可执行文件的路径
    esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”
    用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内
    safe_mode = On
    safe_mode_exec_di r= /usr/local/php/bin/

客户端脚本植入

  • 客户端脚本植入(Script Insertion),是指将可以执行的脚本插入到表单、图片、动画或超链接文字等对象内。当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击。
    可以被用作脚本植入的HTML标签一般包括以下几种:
    <script>标签标记的javascript和vbscript等页面脚本程序。在<script>标签内可以指定js程序代码,也可以在src属性内指定js文件的URL路径<br/><object>标签标记的对象。这些对象是java applet、多媒体文件和ActiveX控件等。通常在data属性内指定对象的URL路径<br/><embed>标签标记的对象。这些对象是多媒体文件,例如:swf文件。通常在src属性内指定对象的URL路径<br/><applet>标签标记的对象。这些对象是java applet,通常在codebase属性内指定对象的URL路径<br/><form>标签标记的对象。通常在action属性内指定要处理表单数据的web应用程序的URL路径</script>

客户端脚本植入的攻击步骤
1、攻击者注册普通用户后登陆网站
2、打开留言页面,插入攻击的js代码
3、其他用户登录网站(包括管理员),浏览此留言的内容
4、隐藏在留言内容中的js代码被执行,攻击成功

PHP の脆弱性について何を知っていますか? (詳しい紹介)


データベース
CREATE TABLE `postmessage` (
`id` int(11) NOT NULL auto_increment,
`subject` varchar(60) NOT NULL デフォルト”,
`name` varchar(40) NOT NULL デフォルト ”,
`email` varchar(25) NOT NULL デフォルト ”,
`question` mediatext NOT NULL,
`postdate` datetime NOT NULL デフォルト '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT='ユーザーのメッセージ' AUTO_INCREMENT=69;
/ /add.php メッセージを挿入します
//list.php メッセージ リスト
//show.php メッセージを表示します

# 以下にメッセージを送信します

PHP の脆弱性について何を知っていますか? (詳しい紹介)

このメッセージを閲覧すると js スクリプトが実行されます

<script>while(1){windows.open();}</script> 無限ポップアップ ボックスを挿入します
Insert<script>location.href="http://www.sectop.com";</script> フィッシング ページにジャンプします
または、他の自己構築された JS コードを使用して攻撃します

防止方法
特殊文字を HTML エンコードに変換するには、通常、htmlspecialchars 関数を使用します。
関数プロトタイプ
string htmlspecialchars (string string, int quote_style, string charset)
string はエンコードされる文字列です
quote_style オプションで、値は ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES、デフォルト値 ENT_COMPAT、つまり二重引用符のみを変換し、一重引用符は変換しません。ENT_QUOTES は二重引用符を意味し、一重引用符 すべて変換する必要があります。 ENT_NOQUOTES、二重引用符と一重引用符が変換されないことを示します。
charset はオプションで、使用される文字セットを示します。
この関数は、次の特殊文字を HTML エンコードに変換します:
& —-> & gt; &
" —-> "
' —-> '
> —-> >
show.phpの98番目を入れます

に行を変更し、jsが挿入されている脆弱性ページを確認してください
PHP の脆弱性について何を知っていますか? (詳しい紹介)

XSS クロスサイト スクリプティング攻撃

##クロスサイト スクリプティングは主に、Web サイト ユーザーの Cookie やその他の個人データを読み取るために攻撃者によって使用されます。攻撃者がこのデータを取得すると、このユーザーになりすまして Web サイトにログインし、このユーザーの許可を取得することができます。
クロスサイト スクリプティング攻撃の一般的な手順:
1. 攻撃者は、何らかの方法で xss http リンクをターゲット ユーザーに送信します。
2. ターゲット ユーザーは、この Web サイトにログインし、送信されたリンクを開きます。攻撃者によるログイン期間中の xss リンク
3. Web サイトはこの xss 攻撃スクリプトを実行しました
4. 対象ユーザーのページは攻撃者の Web サイトにジャンプし、攻撃者は対象ユーザーの情報を取得しました
5.攻撃者はターゲット ユーザーの情報を使用しました Web サイトにログインして攻撃を完了します

クロスサイト脆弱性を持つプログラムが表示されると、攻撃者は http://www.sectop.com のようなものを構築する可能性があります/search.php?key=