OneNote に切り替えて以来、長い間新しいエッセイを公開していませんでしたが、それでも考えることが非常に必要です。ここ数日で PHP コード監査を学び始めたので、投稿を始めましょう。まずはエッセイ!
まず、トップ 10 のテスト プラットフォーム dvwa を通して学習を始めましょう。まず、参考のために有名人のリンクをここに持ってきてください。
1.http://drops.wooyun.org/papers/4832. http://www.lxway.com/86980986.htm is_numeric 関数のバイパス
3.http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html 文字エンコーディングのバイパス ワイドバイトインジェクション
0x01
リーリー
これを見ると、このコードは実際にはid を処理せず、その結果、sqlインジェクションの脆弱性が生じていることがわかります。OK、あらゆる種類のインジェクションが可能です。だから、ここでは詳しく説明しません。
中級レベル、コード: リーリー Mysql_real_escape_string 関数は id パラメータをエスケープします。一般的なエスケープには
があります。' =>
この関数は主に文字系の特殊文字の処理を目的としているので、特殊文字を使わずに注入、つまり数値注入が可能です
リーリー
これにより、users テーブルのアカウントのパスワードを取得できます。もちろん、具体的なテーブル名が分からず、列名を変更した場合はどうなるかという疑問が生じます。 OK、ユニオンブールインジェクションを使ってみましょう
リーリーchar() の値を変換して制限する必要がありますが、これにはさらに時間がかかる可能性があります (追記: まずピットを利用してください)。実際には、遅延注入を使用して同じ効果を達成できます。
2.ワイドバイトインジェクション
mysql_real_escape_string
パラメータをエスケープする方法は、「」を追加することです。そのurlエンコーディングは%5cなので、%df%5c%27をパラメータに追加します。ここで、%df %5c は合法的なgbkキャラクターです
そして、この関数で処理すると、 %df%5c%5c%27 、 このように%df%5c となることがわかります。 %5c を飲み込むと、 a gbkキャラクター+ \' になります そして、 mysql のエスケープ文字も '' であり、これは単一引用符の挿入と同等です
リーリー
high级别的php代码 好吧,这样一来,我觉得还是变得很安全了,前面2个函数对字符型的注入进行了处理,紧接着is_numeric函数则对数值型注入进行了处理。 然而这样子仍然可以造成sql注入,不过是二次注入,且限制的条件也比较苛刻但是仍有机会造成注入 比如执行sql语句 此时传入的字符串$s=0x31206f722031 这样看可以知道这是一个16进制数,可以通过该函数的检测,然后对16进制解码我们可以发现$s其实实际的值为 ‘1 or 1’ 那么这样操作数据库里会变成什么样子 可以看到数据库将这串16进制数进行了转码变成了1 or 1 那么到时候进行数据库取值然后不经处理带入到另一个sql语句中就会造成二次注入.所以我们在写代码的时候不能盲目的信任数据库里的数据,在取出数据时仍需要进行检测。 sql部分的代码就分析到这里,如有不正确的地方,欢迎拍砖! 下篇准备sql blind :)
同じaddslashes関数にも同じ問題があります。詳細は記事冒頭のリンクを参照してください
0x02
<span>$id</span>=<span>$_GET</span>['id'<span>];
</span><span>$id</span>=<span>stripslashes</span>(<span>$id</span><span>);//剔除参数中的斜杠
</span><span>$id</span>=<span>mysql_real_escape_string</span>(<span>$id</span><span>);//对id中的特殊字符进行转义
</span><span>if</span>(<span>is_numeric</span>(<span>$id</span><span>)){//判断是否是数值或数值字符串
</span>...
<span> insert</span> <span>into</span> test(type) <span>values</span>($s);
0x03