Pikachu 漏洞練習(xí)平臺Sql Injection Insert/update型注入通關(guān)指南pika~pika~

天氣忽冷忽熱,記得及時保暖,才不是特意跟你一個人說的呢~
DML
DML(Data Manipulation Language)數(shù)據(jù)操作語言,以 INSERT、UPDATE、DELETE 三種指令為核心,分別代表插入、更新與刪除,是必須要掌握的指令,DML 和 SQL 中的 select 熟稱 CRUD(增刪改查)。
INSERT插入的兩種方式:
1、insert into 表名[(字段,字段)] values (值,值);
說明:
值和字段需要一一對應(yīng)
如果是字符型或日期類型,值需要用單引號引起來;如果是數(shù)值類型,不需要用單引號
字段和值的個數(shù)必須一致,位置對應(yīng)
字段如果不能為空,則必須插入值
可以為空的字段可以不用插入值,但需要注意:字段和值都不寫;或字段寫上,值用 null 代替
表名后面的字段可以省略不寫,此時表示所有字段,順序和表中字段順序一致。
2、insert into 表名 set 字段 = 值,字段 = 值;(不常見建議用方式一~~~)
批量插入方式
insert into 表名 [(字段,字段)] values (值,值),(值,值),(值,值);
INSERT注入就是用插入的方式進(jìn)行注入,并不是用insert into插入數(shù)據(jù)進(jìn)行注入,在這里我選擇用
基于Xpath的報錯注入
首先介紹兩個函數(shù):
1、updataxml():
官方定義:
UPDATEXML (XML_document, XPath_string, new_value);
第一個參數(shù):XML_document是String格式,為XML文檔對象的名稱;
第二個參數(shù):XPath_string (Xpath格式的字符串);
第三個參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù);
返回內(nèi)容:若xpath正確則返回更改對象名稱,否則返回xpath錯誤內(nèi)容
2、extractvalue()
官方定義:
EXTRACTVALUE (XML_document, XPath_string);
第一個參數(shù):XML_document是String格式,為XML文檔對象的名稱;
第二個參數(shù):XPath_string (Xpath格式的字符串);
返回內(nèi)容:若xpath正確則返回目標(biāo)XML查詢的結(jié)果,否則返回xpath錯誤內(nèi)容
不知道什么是Xpath請看這里
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。

不理解沒關(guān)系Yukito也沒理解,我們只需要知道
函數(shù)報錯原因
可以看到上面兩函數(shù)里都有xpath路徑,而在xpath中,插入~(ASCII碼是0x7e)和^(ASCII碼是0x5e)等特殊字符是非法的,也就會產(chǎn)生報錯,而這些特殊字符也恰好是報錯注入的關(guān)鍵點,而當(dāng)報錯內(nèi)容為SQL語句的時候,SQL那邊的解析器會自動解析該SQL語句,就造成了SQL語句的任意執(zhí)行。
新手的話還是一步一步來吧,有點“這是你的鍵盤,這是kali-linux系統(tǒng),好了現(xiàn)在開始入侵CIA(美國中央情報局)吧”的感覺了

回到正題,注冊完賬號登陸進(jìn)去了之后,可見只有兩個按鈕,退出登錄和修改個人信息

點擊【修改個人信息】就能開始插入數(shù)據(jù)了,使用postman

設(shè)置好cookie之后,先提交submit一遍數(shù)據(jù)從瀏覽器里開發(fā)者選項里獲取參數(shù)

對應(yīng)body里的form-data


輸入單引號報錯,說明存在注入點

上面我們說過:
在xpath中,插入~(ASCII碼是0x7e)和^(ASCII碼是0x5e)等特殊字符是非法的,也就會產(chǎn)生報錯,而這些特殊字符也恰好是報錯注入的關(guān)鍵點,而當(dāng)報錯內(nèi)容為SQL語句的時候,SQL那邊的解析器會自動解析該SQL語句,就造成了SQL語句的任意執(zhí)行。
' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))or'

在這里總結(jié)一下學(xué)到了一個新知識,首先是要注意開頭部分的and和or,and不行那就改用or,或者用替換符&&(and)和||(or),其次是閉合的方式不只有#和--+,還有or'(溫故而知新,可以為師矣)
同時這里的group_concat語句意思是將結(jié)果連接成一條字段輸出,當(dāng)然也可以用分段函數(shù)limit()/mid()/left()/right()


在這里服務(wù)器返回的只有一部分的數(shù)據(jù),group_concat()參數(shù)無法全部返回,只能使用分段函數(shù)limit()/mid()/left()/right(),這里我用limit()舉例,并不是因為另外三個函數(shù)我不會用


拿到字段名,可以獲取數(shù)據(jù)了

我懶得截圖了,反正就是修改limit之后的數(shù)字就能逐個遍歷出來了
admin:e10adc3949ba59abbe56e057f20f883()
pikachu:670b14728ad9902aecba32e22fa4f6b
test:e99a18c428cb38d5f260853678922e0
收工
不光是上面的寫法,還有另外一種報錯寫法是基于floor()函數(shù)的
'or (select 1 from (select count(*),concat((select group_concat(username,0x3a,password) from users),floor(rand(0)*2))x from information_schema.tables group by x)b) or'
標(biāo)紅的地方是固定寫法
總結(jié)一下學(xué)到了一個新知識,首先是要注意開頭部分的and和or,and不行那就改用or,或者用替換符&&(and)和||(or),其次是閉合的方式不只有#和--+,還有or'(溫故而知新,可以為師矣)extractvalue()