SQL injection 1: 如何從資料庫中獲取想要獲得的內容?
以下是整理的網上的一些資料:
如何從資料庫中獲取想要獲得的內容?
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 Streaming從Kafka中獲取數據,並進行實時單詞統計,統計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