題目地址:http://43.247.91.228:84/Less-1/
0x01 先看題目的描述,查找注入點(diǎn)

welcome 下面說輸入ID作為帶有數(shù)字值的參數(shù)。首先令?id=1嘗試下:有顯示兩列。

嘗試著讓返回頁面報(bào)錯(cuò),可以嘗試加單引號(hào),雙引號(hào),括號(hào)等, 發(fā)現(xiàn)加單引號(hào)報(bào)錯(cuò)并返回錯(cuò)誤信息。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '1'' LIMIT 0,1 ' at line 1
這個(gè)位置就應(yīng)該是注入點(diǎn)了。
0x02 分析后臺(tái)查詢語句的結(jié)構(gòu),使其閉合
不管報(bào)錯(cuò)的兩端的單引號(hào),只分析'1'' LIMIT 0,1,1和'? 是我們輸入的,后端代碼很可能是
select name,password where id='$id' LIMIT 0,1
我們可控的參數(shù)只有$id,所以我們輸入數(shù)字,加上單引號(hào)之后使id閉合之后。加上#(%23或者--+)屏蔽掉原來的' LIMIT 0,1 。 令?id=1' %23, 成功返回結(jié)果。

0x03 進(jìn)行聯(lián)合查詢,查看是否能執(zhí)行查詢語句
聯(lián)合查詢要求查詢的列數(shù)相同,首先得檢測列數(shù),有兩種方法檢測:union select加不同列數(shù)的數(shù)字和利用order by
1. 利用union select加不同列數(shù)的數(shù)字
從1列開始,直到列數(shù)相同返回正確的顯示為止


2. 利用order by進(jìn)行測試
order by 加數(shù)字。如果數(shù)字小于列數(shù),不報(bào)錯(cuò);如果數(shù)字大于列數(shù),將報(bào)錯(cuò)。(不報(bào)錯(cuò)的最大數(shù)即為列數(shù))猜測一個(gè)稍微大點(diǎn)的數(shù)字,用二分法可以比較快速的定位到列數(shù)。(可以先執(zhí)行order by 1,如果報(bào)錯(cuò)說明語句存在錯(cuò)誤)


3. 找到列數(shù)之后,執(zhí)行union select查詢能否執(zhí)行函數(shù)
我們注意到,使用union select 1,2,3 時(shí),頁面將2和3顯示了出來。我們用簡單函數(shù)database(),或者user() 來代替2和3的位置,看是否可以執(zhí)行函數(shù)。

0x04 爆出所有數(shù)據(jù)庫
這里插入一段前置知識(shí):
1. 數(shù)據(jù)庫存儲(chǔ)的結(jié)構(gòu)
層級(jí)依次是,數(shù)據(jù)庫>>表>>字段>>值。具體而言,我們的MySQL數(shù)據(jù)庫中一般會(huì)包含許多數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫中又會(huì)包含幾個(gè)表,每個(gè)表又會(huì)有多個(gè)字段,字段又會(huì)對(duì)應(yīng)多個(gè)值。
2. MySQL數(shù)據(jù)庫中的重要表
MySQL數(shù)據(jù)庫中有個(gè)重要的information_schema庫,庫中包含三個(gè)重要的表:
? SCHEMATA : 這個(gè)表包含了所有數(shù)據(jù)庫的名字
? TABLES : 這個(gè)表包含了所有表的名字
? COLUMNS : 這個(gè)表包含了所有字段的名字



我們可以嘗試這列出所有的數(shù)據(jù)庫:
payload=?id=-1' union select 1,2,schema_name from information_schema.schemata %23

上面的操作只顯示了數(shù)據(jù)庫的第一條,也許是因?yàn)閘imit 0,1 的原因,限制了只能顯示一條,下面我們使用group_concat()函數(shù),把所有結(jié)果變成一條。
payload=?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata %23

0x05 查詢當(dāng)前數(shù)據(jù)庫的所有表
有了上面的經(jīng)驗(yàn),我們稍作修改即可查詢:
payload=?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23

0x06 查詢敏感表下的列,尋找敏感字段
我們對(duì)users表中的信息比較感興趣,從users表中進(jìn)行查詢。
payload=?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = database() and table_name='users' %23

0x07 查詢敏感字段下的值
payload= ?id=-1' union select 1,group_concat(username),group_concat(password) from users %23
