射出要約によって引き起こさstr_replaceの問題

    注入の安全性の問題の研究を交換してください。

    SQLインジェクションは、一般に、濾過、フィルタリング機能にaddslashesへの参照です。

 

 

彼は、注入された単一引用符に変換されます\」、他のバックスラッシュに変換\\二重引用符\」に変換します

  PHPコードを書きます:

<!DOCTYPE HTML> 
<HTML> 
<HEAD> 
    <TITLE> </ TITLE> 
    <META HTTP-当量= "Content-Typeの"コンテンツ= "text / htmlの;のcharset = UTF-8" /> 
</ HEAD> 
<BODY > 
<?PHPの
     $ xに = $ _GET [ 'X' ];
    $のID = str_replaceにaddslashes$ _GET [ 'Y'])、 '' にaddslashes$ X ));
    エコー "后过滤:"。addslashes$ xに。) "<BR/>" エコー「替换绕过置き換えます」。$のID「<BR/>」 。
    $ CONN =mysql_connect( '127.0.0.1'、 'ルート'、 'ルート'); // MySQLデータベース接続
    mysql_select_db( 'テスト'、$コネティカット州); //が接続コネティカット$の要請でテストデータベースの名前を選択します
    $ SQL =「SELECT * 'からID = USER1 WHERE $ ID '「; // 変数の組成物の定義やSQL文のIDを
    $結果 = するmysql_query$ sqlを); //は、変数にSQL文とリターンを実行し、その結果
    しばらく$行 = は、mysql_fetch_array$結果を)) { // 配列データをループして表示
        エコー "IDを" $行 [ 'ID'] "</ BR>。" ; 
        エコー「ユーザー名」。行$ [ '名前'] "</ BR>"。; 
    } 
    にmysql_close$コネティカット州); //は、接続を閉じる
    エコー "<HR>" ; 
     エコー "現在のステートメント:" ; 
     エコー $ SQL ;
?> 
</ボディ> 
</ HTML>

 

  addslashes関数を引用することが判明:

  

 

文字列は、実質的にGGに注入される場合、単一または二重引用符は、直接エスケープ。ゴーン。

  addslashesの質問:

    addslashes 00パーセントは\ 0に変換されます

    「\に単一引用符(」)にaddslashesます

    使用str_replace関数の場合、入力が00%に置き換えられますので「自動的にaddslashesが\ 0 \を機能追加された」、我々は0と一致し、それは\\シングルクォーテーション成功したエスケープをマーク「が再び\転換」になります。  

    

<?PHP
     エコー str_replace( "0"、 ""、 "\ 0 \ '" ?>

\0\'就是我们输入的%00'

  会输出:

    

那么知道了原理根据上面的php代码构造合适的sql语句绕过addslashes过滤

 

单引号成功逃逸,这里不能用单引号闭合了,后门闭合会被过滤那么直接:

  返回真:

    

 

返回假

 

那么想出数据就很方便。这里不演示了常规语句就行了。

模拟环境没啥意思,去网上找了个别人的代码审计文章,找到了一个雨牛挖的cmseasy的str_replace绕过注入的真实案例

  2014年的漏洞,cmseasy相关版本网上已经找不到了,我改写了个cmseasy,方便测试这个replace注入:

  cmseasy环境下载:链接:https://pan.baidu.com/s/1w-knpeOp8D4AuWe3N5U1vA  密码:jk1a

  存在问题的目录lib/plugins/pay/alipay.php

  第87行用了str_replace替换

  

 

替换后的内容赋值给了$order_sn

  往下看发现调用了check_money函数,跟踪下这个函数查看内部实现:

  uploads/lib/table/pay.php

  

 

  先是赋值然后调用了getrow函数,跟进去看看:

  uploads/lib/inc/table.php

  

 

  condition没有啥数据库操作后跟下面那个函数,跟踪下rec_select_one:

  还在table.php文件下:

  

  跟下sql_select函数:

  

 

被带入数据库查询:

  默认echo $sql;是被注释的,解除注释方便查看sql语句:

  因为str_replace的缘故,可以被绕过进行sql注入:

  去除注释符,构造poc:

  http://localhost/CmsEasy/uploads/index.php/?case=archive&act=respond&code=alipay&trade_status=WAIT_SELLER_SEND_GOODS

  POST:out_trade_no=11111%00'&subject=0
 sql语句报错存在sql注入

那么修复方案是什么呢?
  回到刚开始的alipay.php
第79行
  

 

  正则匹配下\'
    然后再次访问:
直接跳转了不再停留了。
  

 

修复方案:
  
function respond() {
        if (!empty($_POST)) {
            foreach($_POST as $key =>$data) {
                if(preg_match('/(=|<|>|\')/', $data)){
                    return false;
                }
                $_GET[$key] = $data;
            }
        }
参考文章:https://wizardforcel.gitbooks.io/php-common-vulnerability/content/23.html

おすすめ

転載: www.cnblogs.com/piaomiaohongchen/p/11304582.html