BugScanプラグインの作成に関するいくつかのテクニック

5101 ワード

1.先頭定義
プラグインを作成するときは、一般的にコードの開始位置で書くだけです.
#!/usr/bin/env python

正常に動作します
しかし、このプラグインの情報を説明するために、個人的には以下のフォーマットで書くことをお勧めします.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ =   /  ID/  
#__Service_ =     /   CMS
#__Refer___ =     /  
#___Type___ =     (  /XSS/    /    /……)
#___name___ =     /CVE  /WooYun  /    /  
'''
      
'''

2.SQL注入とXSS
通常SQL注入の検証ではMD 5(123)を使用しています.そして、MD 5値が存在するかどうかを確認します.このような正則を使ってマッチングすることがよく見られます.プラグインを書く人は正則を考えて頭を破りたいと思っています.プラグインの理解を見ても、正則を見ても頭を破りたいと思っています.私たちは機能が変わらないことを保証するために、コードの可読性を高めるために少し変更することができます.実行効率もやや良い点で例を挙げます
#!/usr/bin/env python
b = "abcdefghijk"
c = "abc" in b
d = "xyz" in b
print c
print d

に戻る
TrueFalse

cの値はTrue,dの値はFalseであり,いずれもブール変数であるためstr in strは条件として判断できる.
#!/usr/bin/env python
b = "abcdefghijk"
if "abc" in b :
    print "OK"

注入検証、XSS検証などの検証方法を正則からif判断に変更することができます
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def audit(arg):
    page = arg + 'readnes.php'
    payload = "?id=1 and 123=321 union select 1,md5(123),3,4,5"
    url = page + payload
    code, head, res, _, _ = curl.curl('%s' % url)
    if code == 200 and '202cb962ac59075b964b07152d234b70' in res: 
    #      , and
      security_hole(verify_url)

3.正規使用
正則を使用してマッチングしなければならない場合、例えば絶対パスが漏洩したり、絶対パスにマッチングしたりする場合などは、正則を使用するしかありません.
4.注入検証
共同注入はアカウントのパスワードを読むことができなくて、直接MD 5値を印刷して注入が存在するかどうかを検証します通常の情況の下で特有の表名が現れないことができなくて、漏れを防止して注入検証の時、from xxxを使わないでください、例えば
#!/usr/bin/env python
def audit(arg):
    page = arg + 'readnes.php'
    payload1 = "?id=1 and 11=22 union select 1,md5(123),3,4,5 from admin"
    payload2 = "?id=1 and 11=22 union select 1,md5(123),3,4,5"
    # payload 1  payload 2          ,  from    
    #              ,           ,   

XSSはresに直接str in strでいいです
5.組み合わせ判定
判断するときはできるだけ組み合わせで判断し、よく見られます
#!/usr/bin/env python
if code == 200:
    if '202cb962ac59075b964b07152d234b70' in res:
        security_hole(verify_url)

このように書くとコードの可読性が低く、機能が一致する原則で
#!/usr/bin/env python
if code == 200 and '202cb962ac59075b964b07152d234b70' in res:
    security_hole(verify_url)

全体的な判断を明確に見ることができ,一歩で,ifネスト保持機能がそれほど変わらない場合にコードの可読性と実行効率を向上させることができる.
6.変数定義
変数を新しい定義を行わずに定義できます.たとえば、
#!/usr/bin/env python
url = arg

これはまったく必要のない一歩で、完全に書くことができます.
#!/usr/bin/env python
payload= "readnews.php?id=1 and 1=2 union select 1,md5(1),3,4"
url= arg + payload

一歩で成し遂げることができることは断固として無駄にしない.
7.インデントの問題
インデントはできるだけ4つのspaceを使用sublime textエディタを使用する場合はPython PEP 8 Autoformatをインストールしてコードのフォーマットが完了したら構文シェーディングpythonを設定し、Ctrl+Alt+Rショートカットを使用してコードをフォーマットできます
8.複数のpayload問題
メタグループを使用して複数のpayloadsを一緒に配置し、1つのプラグインにコミットし、監査員の作業量を削減します.
payloads = (
            "payload1",
            "payload2",
            "payload3",
            "payload4",
            "payload5",
            )
for payload in payloads:
    url = arg + payload
    code, head, res, errcode, _ = curl.curl('"%s"' % url)
    if code == 200 and "str" in res:
        security_hole(url)

9.一重引用符の問題
一重引用符の問題でcurlが使用できないなど、url postクッキーのデータに一重引用符、二重引用符、スペース文字がある場合はエスケープ*一重引用符%27*二重引用符%22*スペース%20の一部のプラグインでこの方法を使用することを避けるためにフォーマット入力を採用することができます.しかし、コードの可読性が低下したため、脳を焼くことはお勧めできません.
code, head, res, errcode, _ = curl.curl("\""+url+"\"")

フォーマット入力に変更できます
code, head, res, errcode, _ = curl.curl('"%s"' % url)

10.プラグインタイトル
タイトルはできるだけ簡単にプラグインの用途を説明してください:DeDeDeCMS search.php SQL-InjectionはCMSの名前を1つだけ書かないでください.プラグインの内容と役割を調べるのに不便です.
11.サービス名
サービス名はすべて小文字を使用してください例えばDeDecCMS、公式ではそう書いていますが、私たちが定義するときはすべて小文字を使用するdededecmsです
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__author__ = 'xxxxx'

def assign(service, arg):
    if service == "service_type":  #      
        return True, arg

def audit(arg):
        # code
        # code
        # code

if __name__ == '__main__':
    from dummy import *
    audit(assign('service_type', 'http://www.example.com/')[1])
    #       

12.プラグインの変更
プラグインの修正が完了したら、タイトルに表示されている【不合格】を削除してください.
13.プラグインのソース
黒い雲、BeeBeeTo、Exploit-dB、補天などの脆弱性提出プラットフォームで最新の脆弱性を探すこともできますよね現在、プラグインにはSDKに合わないプラグインがあります.
14.サービスタイプ(サービス)
可以在https://www.bugscan.net/#!/n/7すべてのウェブプログラムのサービス名を調べる以外にip,www,rdp,mysql,vnc,ftp,smtp,mssqlwwwの使用エラーがあります.サービスがwwwの場合、urlはすべてディレクトリと接続を含めてwwwです.wwwサービスタイプを慎重に使用するにはすべて小文字を使用してください.
def assign(service, arg):
    if service == "wordrpess":  # 1. service   
        return True, arg

しばらく考えていたので、後で他のものがあったら補充します.