1. 程式人生 > >SQL injection 1: 如何從資料庫中獲取想要獲得的內容?

SQL injection 1: 如何從資料庫中獲取想要獲得的內容?

    由於我們的專案用到了資料庫,還有JSP頁面,因此先關注一些SQL injection等技術,以便找出應對的辦法。

    以下是整理的網上的一些資料:

如何從資料庫中獲取想要獲得的內容?

http://www.cz88.net/2004/7-6/164357.htm

學習如何從資料庫中獲取想要獲得的內容,首先,我們先看看SQL注入的一般步驟:

    第一節、SQL注入的一般步驟

    首先,判斷環境,尋找注入點,判斷資料庫型別,這在入門篇已經講過了。

    其次,根據注入引數型別,在腦海中重構SQL語句的原貌,按引數型別主要分為下面三種:

  (A) ID=49 這類注入的引數是數字型,SQL語句原貌大致如下:
  Select * from 表名 where 欄位=49
  注入的引數為ID=49 And [查詢條件],即是生成語句:
  Select * from 表名 where 欄位=49 And [查詢條件]


  (B) Class=連續劇 這類注入的引數是字元型,SQL語句原貌大致概如下:
  Select * from 表名 where 欄位=’連續劇’
  注入的引數為Class=連續劇’ and [查詢條件] and ‘’=’ ,即是生成語句:
  Select * from 表名 where 欄位=’連續劇’ and [查詢條件] and ‘’=’’

  (C) 搜尋時沒過濾引數的,如keyword=關鍵字,SQL語句原貌大致如下:
  Select * from 表名 where 欄位like ’%關鍵字%’
  注入的引數為keyword=’ and [查詢條件] and ‘%25’=’, 即是生成語句:
  Select * from 表名 where欄位like ’%’ and [查詢條件] and ‘%’=’%’

    接著,將查詢條件替換成SQL語句,猜解表名,例如:

  ID=49 And (Select Count(*) from Admin)>=0

    如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。如此迴圈,直至猜到表名為止。

    表名猜出來後,將Count(*)替換成Count(欄位名),用同樣的原理猜解欄位名。

    有人會說:這裡有一些偶然的成分,如果表名起得很複雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程式寫得不嚴密或使用者保密意識不夠,才有得下手。

    最後,在表名和列名猜解成功後,再使用SQL語句,得出欄位的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

    我們舉個例子,已知表Admin中存在username欄位,首先,我們取第一條記錄,測試長度:

  http://www.19cn.com/showdetail.asp?id=49 ;;and (select top 1 len(username) from Admin)>0

    先說明原理:如果top 1的username長度大於0,則條件成立;接著就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8

    當然沒人會笨得從0,1,2,3一個個測試,怎麼樣才比較快就看各自發揮了。在得到username的長度後,用mid(username,N,1)擷取第N位字元,再asc(mid(username,N,1))得到ASCII碼,比如:

  id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

    同樣也是用逐步縮小範圍的方法得到第1位字元的ASCII碼,注意的是英文和數字的ASCII碼在1-128之間,可以用折半法加速猜解,如果寫成程式測試,效率會有極大的提高。

第二節、SQL注入常用函式

    有SQL語言基礎的人,在SQL注入的時候成功率比不熟悉的人高很多。我們有必要提高一下自己的SQL水平,特別是一些常用的函式及命令。

  Access:asc(字元) SQLServer:unicode(字元)

  作用:返回某字元的ASCII碼

  Access:chr(數字) SQLServer:nchar(數字)

  作用:與asc相反,根據ASCII碼返回字元

  Access:mid(字串,N,L) SQLServer:substring(字串,N,L)

  作用:返回字串從N個字元起長度為L的子字串,即N到N+L之間的字串

  Access:abc(數字) SQLServer:abc (數字)

  作用:返回數字的絕對值(在猜解漢字的時候會用到)

  Access:A between B And C SQLServer:A between B And C

  作用:判斷A是否界於B與C之間

    第三節、中文處理方法

    在注入中碰到中文字元是常有的事,有些人一碰到中文字元就想打退堂鼓了。其實只要對中文的編碼有所瞭解,“中文恐懼症”很快可以克服。

    先說一點常識:

    Access中,中文的ASCII碼可能會出現負數,取出該負數後用abs()取絕對值,漢字字元不變。

    SQLServer中,中文的ASCII為正數,但由於是UNICODE的雙位編碼,不能用函式ascii()取得ASCII碼,必須用函式unicode ()返回unicode值,再用nchar函式取得對應的中文字元。

    瞭解了上面的兩點後,是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函式要注意、猜解範圍大一點外,方法是沒什麼兩樣的。

相關推薦

SQL injection 1: 如何資料庫獲取獲得內容?

    由於我們的專案用到了資料庫,還有JSP頁面,因此先關注一些SQL injection等技術,以便找出應對的辦法。    以下是整理的網上的一些資料: 如何從資料庫中獲取想要獲得的內容? http://www.cz88.net/2004/7-6/164357.htm學習

1.簡單例項:ASP.NET下Echarts通過Ajax資料庫獲取資料

後臺:Test01.ashx.cs:從資料庫獲取資料,通過HTTP請求(HttpContext)實現和前臺資料傳遞json資料 using System; using System.Collections.Generic; using System.Linq; using

Spring+Quartz 資料庫獲取定時任務和定時時間,動態實現對定時任務的增刪改查

本文轉載自部落格:http://blog.csdn.net/wwkms/article/details/48851005 ----------------------------------------------------------------------------------------

資料庫獲取的資料寫入到Excel表

pom.xml檔案寫入程式碼,maven自動載入poi-3.1-beta2.jar <!-- https://mvnrepository.com/artifact/poi/poi --> <dependency>

ASP.NET+Echarts+Ajax資料庫獲取資料

html <div class="panel-body"> <div id="signNum" style="height: 400px; width:

Jmeter-資料庫獲取資料並作為變數傳輸

再今天重新學習,從資料庫中取資料,並作為變數傳到下一個請求中。 首先第一步要匯入mysql驅動包 一、新增JDBC Connection Configuration 設定連結 Database URL: jdbc:mysql:// 資料庫地址 /庫名 JDBC Driver class:com.my

是用JDBC資料庫獲取資料並以java物件返回

/** * * @param c * for example Person.class * @param primaryKeys * primaryKeys為主鍵,引數順序和表中保持一致 如果id, name

php資料庫獲取資料用ajax傳送到前臺

1、資料庫的欄位: 2、php連線資料庫獲取資料庫的資訊放入json_encode($css);{檔案為:db.php} <span style="font-size:14px;"><?php $host="localhost"; $username=

資料庫獲取今天的記錄,最近一週的記錄

條件where  to_days(addtime) = to_days(now()); 這裡要了解to_days()函式的意思。定一個日期,返回一個天數(年為0以來的天數)。 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= d

資料庫獲取值填入下拉列表,然後做二級關聯所產生的一系列問題

今晚因為需要研究jquery動態繫結兩個下拉列表框,並且使兩個下拉列表框聯絡起來,所以做了下小例子 首先,建立了兩張表 每個表裡包含兩個欄位,一個id,一個名字 插入了一些資料,兩張表通過ID進行關聯,這是資料庫的做法 然後CS檔案中寫的程式碼如下:

freemarker的DatabaseTemplateLoader資料庫獲取模板資訊

import com.kingnet.xyzs.orm.dao.DmsMdTemplateConfigMapper; import com.kingnet.xyzs.orm.entity.DmsMdTemplateConfig; import freemarker.cach

如何SQL資料庫獲取某個欄位的型別和長度

1.select column_name,data_type,character_maximum_lengthfrom information_schema.columnswhere table_name='TableName' and column_name='ColNam

資料庫SQL實戰 --12.titles表獲取按照title進行分組,注意對於重複的emp_no進行忽略

題目描述 從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。 注意對於重複的emp_no進行忽略。 CREATE TABLE IF NOT EXISTS "titles" ( `emp_no` int(11) NOT NULL, `tit

資料庫SQL實戰 --11.titles表獲取按照title進行分組

題目描述 從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。 CREATE TABLE IF NOT EXISTS "titles" ( `emp_no` int(11) NOT NULL, `title` varchar(50) NOT

c#向SQL Server儲存圖片並且再資料庫讀取圖片

前言 資料庫課程設計答辯時,老師提出瞭如果資料是圖片或者其他檔案型別的時候,頓時覺得自己做的管理系統用到的較多的就是Char型別。於是,答辯結束後,就蒐集資料學習,在查詢資料的時候發現,有的一開始並不能看懂,找到一篇文件,自己做了一個測試,然後發現出現了一點小

資料庫取出指定範圍內的資料條數的SQL語句(分頁處理的關鍵)

$sql = "SELECT * FROM `message` limit $start,$size";如:SELECT * FROM `message` limit 10,3該sql語句表示從表message中的第10行開始取後面的三條記錄,也就是第10、11、12行的資料

Spark StreamingKafka獲取數據,並進行實時單詞統計,統計URL出現的次數

scrip 發送消息 rip mark 3.2 umt 過程 bject ttr 1、創建Maven項目 創建的過程參考:http://blog.csdn.net/tototuzuoquan/article/details/74571374 2、啟動Kafka A:安裝ka

超時時間已到。超時時間已到,但是尚未獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。

intel weight 關閉 雙擊 itl 手動 瀏覽器 默認 取數據 超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。 解決辦法 1.在代碼裏面,把未關閉的連接關閉 2.擴大共享池,方法如下:

Django如何Model獲取字段名稱——verbose_name

blog color 學習 url post 定義 ole app war 一、背景 CRM項目重新總結一下,重寫之前的項目發現有不少知識點已經忘記,所以特此來重新總結一下一便後續能夠回憶起 二、代碼分析 1. 核心代碼 from django.conf.urls imp

MySQL、SQL server 、Oracle資料庫查詢所有的資料庫,查詢指定資料庫所有表名,查詢所有的欄位的名字

MySQL中查詢所有資料庫名和表名 1.查詢所有資料庫 show databases; 2.查詢指定資料庫中所有表名 select table_name from information_schema.tables where table_schema='database_name' a