基于约束的SQL攻击
基于約束的SQL攻擊原理:
沒有將字段設置為唯一字段,導致可以利用mysql會略去空格(前提:空格后面沒有字符)這一特性,查詢或插入敏感信息
先創建一個user表,定義三個字段(id、username、password)
CREATE TABLE user( id INT NOT NULL auto_increment, username VARCHAR(30) NOT NULL, password VARCHAR(30) NOT NULL, PRIMARY KEY(id));id:int型,非空,自動增加
username:30個字符長度,非空
password:30個字符長度,非空
主鍵是id
向user表中插入數據,假設插入如下所示數據
常見的查詢語句:
但注意,我們使用select * from user where username='admin ';查詢時,依舊可以查詢到數據,為什么呢?因為,mysql會略去空格去查詢
我們上面創建了一個表,username限制的位數是30位,但如果我們插入31位數據呢?它會自動將30位后面的數據自動刪去
假設我們向user表中插入數據,Mysql先查詢該數據是否存在于數據庫中,不存在才會插入
例:
SQL語句:
insert into user values ('','adminadminadminadminadminadmink','123456');
結果插入成功,并且發現,插入的username為adminadminadminadminadminadmin,第31位的k被刪去了
注:此時去查詢adminadminadminadminadminadmink是不存在的
如:
所以我們可以利用這一特性,插入一個和第一個admin同名不同密碼的admin
例:
只要記住三點:
①不管sql查詢還是插入,都會略去空格(前提:空格后面沒有字符)
②插入數據時,先查詢該username在數據庫中是否存在,不存在,則插入
③插入數據時,會刪去高出限制的字符
insert into user values ('','admin 1','peak');的執行流程:
(1)先查詢username為admin 1在數據庫中是否存在,結果不存在
(2)將admin 1插入到數據庫中,因為username限制為30位,所以插入時刪除1,插入admin,又因為插入數據時會略掉空格,所以最終插入的username為admin,查詢admin時,會出現兩個數據,如下
注:這里可能有人要問,sql查詢時也會略去空格,那么你查詢admin 1時怎么沒有略去,因為空格后面有字符1,所以不能略去;而且user表的30位長度限制,是限制插入數據的,所以user表中不可能存在超過30位的username,你現在查超過30位的username,user表中怎么可能存在,所以可以進行下一步,也就是插入數據。
實例:
1、隨便注冊個賬號,發現如下所示
2、看來需要獲取管理員權限,題目提示這里存在sql約束攻擊,根據題目示意,我們應該可以注冊一個admin的管理員賬號,密碼自己設定
這個原理簡單再說下,你既然要注冊,那么注冊時,肯定會判斷你注冊的用戶名是否存在,存在是不可以注冊的,不存在才可以注冊,這里注冊的用戶名為admin無數個空格1,數據庫在判斷該用戶名是否存在時,肯定是不存在的,所以可以注冊;關鍵是插入注冊的數據時,因為無數個空格,超過了用戶名長度的限制,所以最后的sql插入語句為admin無數個空格,插入時再略去空格,最后成功插入admin
3、以admin登錄,密碼自己剛設置的,即可獲得flag
總結
以上是生活随笔為你收集整理的基于约束的SQL攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vscode+php+phpstudy:
- 下一篇: SQL必知基础