Sqli-Labs 是一個印度人的開源項目平臺挠他。里面包含了基本的各種注入類型女阀,同時又有g(shù)et和post類型湖员,以及一些基本的繞過學習漠其。
項目地址:https://github.com/Audi-1/sqli-labs
Lesson-1 #Get - Error based - Single quotes - String (基于錯誤的GET單引號字符型注入)
運行測試環(huán)境:http://localhost/sqli-labs-master/Less-1/
輸入ID參數(shù)1:http://localhost/sqli-labs-master/Less-1/?id=1嘴高,返回正常,繼續(xù)測試陸續(xù)輸入2和屎,3拴驮,4,5柴信,6....,均返回正常套啤,而且隨著參數(shù)ID值的改變,頁面返回的name和Password的值也會出現(xiàn)不同
根據(jù)上面情況随常,推測出數(shù)據(jù)庫操作指令:
【SELECT name,Password FROM TABLE WHERE ID=INPUT_ID】
試著來讓其報錯潜沦,報錯的方法通常有 單引號 and1=1 and 1=2 雙引號 反斜杠 注釋 等等
我輸入單引號進行測試:
【http://localhost/sqli-labs-master/Less-1/?id=1%27】
網(wǎng)站報出錯誤信息:
【You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1】
根據(jù)報錯信息可以推測出更加詳細的SQL語句:
由錯誤提示【'??? '??? 1'??? '???? LIMIT 0,1??? '】推測的SQL語句存在單引號
【SELECT name,Password FROM TABLE WHERE ID='$ID'】
發(fā)現(xiàn)報了SQL語句的語法錯誤,應該存在SQL注入绪氛,由于沒有過濾單引號唆鸡,我們可以通過閉合單引號來構(gòu)造payload:
利用order by測試數(shù)據(jù)庫中的列數(shù):
【http://localhost/sqli-labs-master/Less-1/?id=1' order by 3 #】
發(fā)現(xiàn)當3的時候不報錯,4的時候報錯枣察,知道數(shù)據(jù)庫表中有三個字段
直接使用UNION語句聯(lián)合查詢争占,但是發(fā)現(xiàn)只出現(xiàn)一行?序目!
【http://localhost/sqli-labs-master/Less-1/?id=1' union select 1,2,3 #】
So臂痕,查看網(wǎng)站源代碼:
源碼中mysql_fetch_array()被調(diào)用了一次,mysql_fetch_array()函數(shù)從結(jié)果集合中取出一行數(shù)據(jù)輸出猿涨,導致不管怎么查詢只能查詢第一行數(shù)據(jù)握童。
mysql_fetch_array(data,array_type)
data:可選。規(guī)定要使用的數(shù)據(jù)指針叛赚。該數(shù)據(jù)指針是 mysql_query() 函數(shù)產(chǎn)生的結(jié)果澡绩。
array_type:可選片效。規(guī)定返回哪種結(jié)果∮⒐牛可能的值:
??? MYSQL_ASSOC - 關(guān)聯(lián)數(shù)組
??? MYSQL_NUM - 數(shù)字數(shù)組
??? MYSQL_BOTH - 默認淀衣。同時產(chǎn)生關(guān)聯(lián)和數(shù)字數(shù)組
如果我傳入的ID值為非負數(shù)(負數(shù)或者0),浮點數(shù)字符或者字符串呢召调?
看到只有第二列和第三列的結(jié)果顯示在網(wǎng)頁上膨桥。
那我們就根據(jù)第二列或者第三列來查詢數(shù)據(jù)庫的信息:
user():返回當前數(shù)據(jù)庫連接使用的用戶
database():返回當前數(shù)據(jù)庫連接使用的數(shù)據(jù)庫
version():返回當前數(shù)據(jù)庫的版本
【http://localhost/sqli-labs-master/Less-1/?id=0'union select 1,version(),3#】
也可以使用數(shù)據(jù)庫的連接函數(shù)來查詢多條信息,常用concat和concat_ws函數(shù)
char碼值對應列表(附)
Char("32") 空格 SPACE???????????? Char("33") !????????????????????? Char("34")
"Char("35") #??????????????????????????????? Char("36") $???????????????????? Char("37") %
Char("38") &???????????????????????????????? Char("39") ’?????????????????????? Char("40") (
Char("41") )?????????????????????????????????? Char("42") *????????????????????? Char("43") +
Char("44") ,?????????????????????????????????? Char("45") -?????????????????????? Char("46") .
Char("47") /?????????????????????????????????? Char("58") :?????????????????????? Char("59");
Char("60") <????????????????????????????????? Char("61") =????????????????????? Char("62")>
Char("63") ??????????????????????????????????? Char("64") @
CONCAT()函數(shù)用于將多個字符串連接成一個字符串
CONCAT(str1,str2,…)
返回結(jié)果為連接參數(shù)產(chǎn)生的字符串唠叛。如有任何一個參數(shù)為NULL 只嚣,則返回值為 NULL。
如果所有參數(shù)均為非二進制字符串艺沼,則結(jié)果為非二進制字符串册舞。
如果自變量中含有任一二進制字符串,則結(jié)果為一個二進制字符串障般。
一個數(shù)字參數(shù)被轉(zhuǎn)化為與之相等的二進制字符串格式调鲸;若要避免這種情況,可使用顯式類型 cast挽荡。
查詢users表中的列名:
寫一個獲取用戶名和密碼的腳本(基于POCsuite):
驗證測試(爆出用戶名密碼):
最后用注入神器SQLMAP來驗證一下藐石,結(jié)果如下:
SQL Injection:就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令定拟。
具體來說于微,它是利用現(xiàn)有應用程序,將(惡意)的SQL命令注入到后臺數(shù)據(jù)庫引擎執(zhí)行的能力青自,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫株依,而不是按照設計者意圖去執(zhí)行SQL語句。