ctfshow ThinkPHP 573

web573

thinkphp3.2.3sqlインジェクション脆弱性
ソースコード

class IndexController extends Controller {
    
    
    public function index(){
    
    
    $a=M('xxx');  //表名
    $id=I('GET.id');
    $b=$a->find($id);
    var_dump($b);
    }
}

通常の注入が機能しない理由を確認するためにデバッグしてみましょう。ローカルSQLテーブルのデータは次のとおりです。
ここに画像の説明を挿入
着信?id=1'
最初に、I関数にフィルターがあり、think_filter関数が呼び出されますが、
ここに画像の説明を挿入
ここに画像の説明を挿入
一致したとしても、最大でスペースを追加しても効果はありません。
検索機能をフォローアップし、検索機能で処理して、フォローアップ_parseOptions$options続けます
ここに画像の説明を挿入

_parseType$options処理後、データベース内
ここに画像の説明を挿入
IDがint型の場合、intval関数に入り、他の文字が直接削除されてフィルタリング効果が得られることがわかります。id型がcharの場合、次のようになります。降りる。
ここに画像の説明を挿入
実行_parseType後、戻っfindselect
ここに画像の説明を挿入
フォローアップbuildSelectSql
ここに画像の説明を挿入
フォローアップparseSqlで
ここに画像の説明を挿入

idの値が$options['where']にあることがわかっており、parseWhereをフォローアップすると
ここに画像の説明を挿入
最終的にparseValueに入ります。parseValueには、addslashes()関数によってエスケープされる
ここに画像の説明を挿入
特定のエスケープ関数が表示されます。
ここに画像の説明を挿入
ここに画像の説明を挿入

addslashes() 函数会在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL

それで、渡すコンテンツが配列であると仮定しますか?配列?id[where]=1'
を渡すとき、次の場合は入力されません$options['where']="1'"。そうでない場合は、次のようになります。
$options['where']['id']="1'"

ここに画像の説明を挿入
今の方法に従って下に移動します。配列の_parseOptions場合は入力します。前述のように、現在は文字列であるため、これは入力しません。したがって、ターゲットデータベースのidフィールドがintの場合、 intvalフィルタリングをバイパスできます。次に、戻ってif in parsewhereを直接入力します。最後に返されるコンテンツは、最後に実行されたsqlステートメントであるため、一重引用符は保持されます。残りは簡単です。ペイロード:以前のストップウォッチ名と列名は詳細に書き込まれていません。$options['where']_parseType$options['where']="1'"
ここに画像の説明を挿入
$whereStr = $where;WHERE 1'ここに画像の説明を挿入
ここに画像の説明を挿入
select * from xxx where 1' limit 1
ここに画像の説明を挿入

?id[where]=id=0 union select 1,flag4s,3,4 from flags

おすすめ

転載: blog.csdn.net/miuzzx/article/details/119424071
おすすめ