1. 程式人生 > >sql注入:md5($password,true)

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

可選。

  • 預設不寫為FALSE。32位16進位制的字串
  • TRUE。16位原始二進位制格式的字串
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注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對傳送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤