sql注入:md5($password,true)
前幾天做了一道CTF的題目,是在”實驗吧“的一道簡單的web題目,當然這道題目很多人都解出來了,因為它的.php檔名就是答案。
他的網頁連結裡面的php檔名就是’ffifdyop.php‘。
上面的’ffifdyop‘就是我們要輸入的密碼。哦,忘了介紹,這道題目只需要表單提交密碼。
當然如果直接輸入ffifdyop,提交後就能出現flag。我也不知道出題的本意是如何,但是也許大家不知道這道題的原理是什麼,為什麼ffifdyop是答案。比如我,我之前一直不知道這個sql注入的原理是什麼。
下面就說明這道題的sql注入的原理,我們可以直接看到後臺裡面的php判斷程式碼:
<!-- $password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密碼錯誤!';
} -->
從程式碼很容易知道,用mysqli_num_rows()函式來判斷是否sql語句查詢結果有返回值,那麼重點就是那條sql語句。那麼唯一可以sql注入的地方就是md5($password,true)這個地方。
那麼首先介紹一下md5這個函式。
語法
md5(string,raw)
引數 | 描述 |
string | 必需。要計算的字串。 |
raw |
可選。
|
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string: 'or'6]!r,b
這裡需要注意的是,當raw項為true時,返回的這個原始二進位制不是普通的二進位制(0,1),而是 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c 這種。
上面的’ffifdyop‘字串對應的16位原始二進位制的字串就是” 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c “ 。 ' \ '後面的3個字元連同' \ '算一個字元,比如’ \xc9 ‘,所以上述一共16個。當然,像’ \xc9 ‘這種字元會顯示亂碼。
然後我們可以用’ffifdyop‘帶入,看一下實際的效果。
這裡32位的16進位制的字串,兩個一組就是上面的16位二進位制的字串。比如27,這是16進位制的,先要轉化為10進位制的,就是39,39在ASC碼錶裡面就是’ ' ‘字元。6f就是對應‘ o ’。
然後我們得到的sql語句就是 SELECT * FROM admin WHERE username = 'admin' and password = ''or'6�]��!r,��b'
為什麼password = ''or'6�]��!r,��b'的返回值會是true呢,因為or後面的單引號裡面的字串(6�]��!r,��b),是數字開頭的。當然不能以0開頭。(我不知道在資料庫裡面查詢的時候,�這種會不會顯示)
這裡引用一篇文章,連線在下面,裡面的原話“a string starting with a 1
is cast as an integer when used as a boolean.“
在mysql裡面,在用作布林型判斷時,以1開頭的字串會被當做整型數。要注意的是這種情況是必須要有單引號括起來的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那麼就相當於password=‘xxx’ or 1 ,也就相當於password=‘xxx’ or true,所以返回值就是true。當然在我後來測試中發現,不只是1開頭,只要是數字開頭都是可以的。
當然如果只有數字的話,就不需要單引號,比如password=‘xxx’ or 1,那麼返回值也是true。(xxx指代任意字元)
表裡就只有一條資料,用於測試。
所以到這裡為止,就完成了sql注入。同時要注意的是,這種sql語句,在mysql裡面是可以行得通的,但是在oracle資料庫裡面這樣的語句是有語法錯誤的。
所以回過頭來為什麼ffifdyop就是答案,因為ffifdyop的md5的原始二進位制字串裡面有‘or’6這一部分的字元。那麼進一步思考這個單引號是否是必要的,這兩個單引號是為了與原有的語句的單引號配對。所以我們理解了這個sql注入的原理,那麼就明白了我們需要怎樣的字串。
當然答案也不止這一個。
content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
string: T0Do#'or'8
這個字串也是符合要求的。因為它含有‘or’8
也許還有其他符合要求的字串,也可以自己寫個程式碼去計算,但是計算次數會很大,下面那篇文章裡的作者就是自己寫的程式碼計算的。
那我們從正向推算一下,要怎麼得到我們要的答案。首先我們要找到一個字串,這個字串經過md5得到的16位原始二進位制的字串能幫我們實現sql注入。首先or這個字串是必要的,同時為了配對原先sql語句裡面有的單引號
在or的兩邊要有單引號,使它變成 password=‘xxx’or‘xxx’ 的形式,所以我們需要的字串的原始二進位制格式的字串裡要包含 ‘or’ ,如果根據原始二進位制來找到我們要的字串可能會比較麻煩,那麼可以根據32位16進位制的字串來查詢,根據上面介紹的, ‘or’ 對應的16進位制是 276f7227 ,所以我們的目標就是要找一個字串取32位16進位制的md5值裡帶有276f7227這個欄位的,接著就是要看關鍵的數字部分了,在276f7227這個欄位後面緊跟一個數字,除了0,1-9,對應的asc碼值是49-57,轉化為16進位制就是31-39,也就是我們需要有276f7227+(31-39)這個欄位,就可以滿足要求。比如xxxxxxxxxxxxxxxx276f7227(31-39)xxxxxx
相關推薦
sql注入:md5($password,true)
前幾天做了一道CTF的題目,是在”實驗吧“的一道簡單的web題目,當然這道題目很多人都解出來了,因為它的.php檔名就是答案。 他的網頁連結裡面的php檔名就是’ffifdyop.php‘。 上面的’ffifdyop‘就是我們
SQL注入:sleep()函式相關解決方案
最近做安全掃描的時候,經常遇到sleep()型的SQL注入,這個是request傳送後會產生一個timeout的delay,沒有respond。 跟我之前遇到的一般意思SQL注入不一樣,之前的是SQL語句拼接產生的注入,會通過注入點抓到資料庫。 這個相當於一種DDOS攻擊,向資料庫不停的
【SQL注入技巧拓展】————4、高階SQL注入:混淆和繞過
【0×01】 – 簡介 大家好,這是一篇致力於文件化我們所從事的高階SQL注入技術的文章。 本文將要揭示能用於現實CMSs和WAFs程式中的高階繞過技術和混淆技術。文中所提到的SQL注入語句僅僅是一些繞過保護的方法。還有一些其他的技術能用於攻擊WEB程式,但是很不幸我們不能告訴你,因為它們就是0
高階SQL注入:混淆和繞過
內容 ############# ######################## 【0×01】 – 簡介 ######################## 大家好,這是一篇致力於文件化我們所從事的高階SQL注入技術的文章。 本文將要揭示能用於現實CMSs和WA
滲透測試:SQL注入攻擊(ASP)
分類: 滲透測試 SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一。隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。
Web安全之:SQL注入
條件 使用者可以接觸並修改傳送到伺服器的內容 URL判斷 and 1=1 and 1=2 依據返回資訊判斷 整形 ’ 同上 字元型判斷 -1 / +1 回顯上個頁面 整形 and sleep(12)
SQL注入筆記02:基於不同引數型別的注入
數字型 $id=$_GET['x'] Select * from news where id=$id 如:?x=1->Select * from news where id=1 注入更改:無 字
SQL注入筆記05:利用和繞過
1、利用當前頁面排版: 如id=1有資料而id=0無資料,則可構造資訊?id=0 union select 1,2,3,user(),version()# 2、利用報錯資訊: 1.ex
Sql 注入詳解:寬位元組注入+二次注入
sql注入漏洞 原理:由於開發者在編寫操作資料庫程式碼時,直接將外部可控引數拼接到sql 語句中,沒有經過任何過濾就直接放入到資料庫引擎中執行了。 攻擊方式: (1) 許可權較大時,直接寫入webshell 或者直接執行系統命令 (2) 許可權較小時,通過注入獲得管理
轉:Google SQL 注入搜尋列表:2018最新版
這是一個Google注入查詢列表(傻瓜式),更新於2018年;根據一些關鍵字和URL結構,可批量查詢出存在安全隱患的站點。 可以用來搜尋境外的站點來進行SQL注入練習和學習使用,切勿未授權對國內站點進行滲透測試。 SQL注入是一種攻擊者利用未經驗證的輸
轉:PHP中防止SQL注入的方法
【一、在伺服器端配置】 安全,PHP程式碼編寫是一方面,PHP的配置更是非常關鍵。 我們php手手工安裝的,php的預設配置檔案在 /usr/local/apache2/conf/php.ini,我們最主要
網易遊戲運維林偉壕:永不落幕的資料庫SQL注入攻防戰
講師介紹 主題簡介: 1、資料庫有什麼安全問題 2、何為資料庫注入 3、資料庫注入攻擊實戰 4、為什麼會發生資料庫注入 5、資料庫注入攻擊防禦 記得以前有人說過,對於一家軟體公司來說,最重要的不是它的辦公樓,也不是它的股票,而是程式碼。程式碼這東西,說到底就是一堆資料。這話不假,但是不僅僅這樣,對
網路攻擊技術:SQL Injection(sql注入) 網路攻擊技術開篇——SQL Injection
網路攻擊技術開篇——SQL Injection 1.1.1 摘要 日前,國內最大的程式設計師社群CSDN網站的使用者資料庫被黑客公開發布,600萬用戶的登入名及密碼被公開洩露,隨後又有多家網站的使用者密碼
sql注入工具:sqlmap命令
sqlmap是一款專業的sql注入工具, 讓你告別人工注入, 程式高效自動注入 前提是你有找到注入點 , 工具的官方網站:http://sqlmap.org/ kali系統預設安裝sqlmap, 不需要額外安裝: sqlmap的命令列幫助: ___
java面試題精解1:詳解XSS攻擊、SQL注入攻擊、CSRF攻擊
1、xss攻擊 1.1 什麼是xss攻擊 XSS全稱cross-site scripting(跨站點指令碼),是當前 web 應用中最危險和最普遍的漏洞之一。攻擊者向網頁中注入惡意指令碼,當用戶瀏覽網頁時,指令碼就會執行,進而影響使用者,比如關不完的
《11招玩轉網路安全》之第四招:low級別的DVWA SQL注入
以DVWA為例,進行手工注入,幫助讀者瞭解注入原理和過程。 1、啟動docker,並在終端中執行命令: docker ps -a docker start LocalDVWA docker ps 執行結果如圖4-19所示。 圖4-19 啟動DVWA 2、在
儲存過程之外:SQL注入深入防禦
幾年以前,對開發者提及”SQL注入”或者要求採取一個”深入防禦”的措施,你大概會遭白眼。如今,越來越多的人聽過”SQL注入”攻擊而且開始關注這些攻擊出現帶來的潛在危險,但是大多數開發者仍然欠缺如何防止SQL注入攻擊的知識,而當問及他們的應用軟體如何防禦SQL注入時,他們通常
JDBC:使用PreparedStatement防止SQL注入
1.關於SQL注入 什麼是SQL注入: 由於jdbc程式在執行的過程中sql語句在拼裝時使用了由頁面傳入引數,如果使用者惡意傳入一些sql中的特殊關鍵字,會導致sql語句意義發生變化,這種攻擊方式就叫做sql注入,參考使用者註冊登入案例。 首先看一下以下程式碼:
暑期練習web18:簡單的sql注入1,2(實驗吧)手工注入及sqlmap
目前只會做1和2。。3的話網上查了wp不知道他們sqlmap沒防任何過濾咱們跑出來的。。。等來年長了本事了,一定要自己手工做出來 注入1的話呢,在輸入1’ or ‘1’=’1的時候就發現存在過濾,後來發現是空格被過濾了,所以我們用註釋符/*來替換空格,注入1的
PHP安全程式設計:防止SQL注入
SQL 注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發者要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對傳送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤