標籤:
著作權聲明:https://github.com/wusuopubupt
閑話不說,直接來!
理論補充:1.http://blog.csdn.net/wusuopubupt/article/details/8752348
2.http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html
1.什麼是SQL注入,猛戳wikipedia查看
2.本地測試代碼:
如果表單提交正確,就列印hello,“username”
否則,列印“404 not found!”
[php] view plaincopy
- <?php
- require ‘config.php‘;
- $DBConnection = mysql_connect ( "$dbhost", "$dbuser", "$dbpwd" );
- mysql_select_db ( "$dbdatabase" );
-
- if(isset($_GET[‘submit‘]) && $_GET[‘submit‘]){
- $sql="select * from test where name=‘".$_GET[‘username‘]."‘and password=‘".$_GET[‘password‘]."‘";
- //echo $sql;exit;
- $result=mysql_query($sql,$DBConnection);
- $num=mysql_num_rows($result);
- if($num>=1)
- {
- echo "hello,".$_GET[‘username‘];
- }
- else {
- echo"404 not found";
- }
- }
- ?>
- <form action="login.php" method="GET">
- <table>
- <tr>
- <td>username</td>
- <td><input type="textbox" name="username"/></td>
- <td>password</td>
- <td><input type="textbox" name="password"></td>
- <td>submit</td>
- <td><input type="submit" name="submit"></td>
- </tr>
- </table>
- </form>
3.瀏覽器介面顯示:
4.重頭戲,sql注入:
5.原理--為什麼使用者名稱不正確,卻可以顯示hello?
我可以echo一下:
[php] view plaincopy
- <span style="font-size:18px;">$sql="select * from test where name=‘".$_GET[‘username‘]."‘and password=‘".$_GET[‘password‘]."‘";
- echo $sql;exit;</span>
顯示:
拿到我的mysql資料庫中查詢:
可以看到,居然能查到資訊,因為sql語句中,前一半單引號被閉合,後一半單引號被 “--”給注釋掉,中間多了一個永遠成立的條件“1=1”,這就造成任何字元都能成功登入的結果。
6.小結:
1)其實這個sql注入過程上很簡單,困難的地方在於提交SQL注入語句的靈活性上面,單引號的使用很關鍵,另外,多用echo列印調試也很值得一試~~
2)GET方式提交表單很危險,所以還是用POST方式吧!
參考:http://blog.csdn.net/gideal_wang/article/details/4316691
3)防止SQL注入:可以看出,sql注入就是使用者提交一些非法的字元(如本文的單引號’和sql語句的注釋號--,還有反斜線\等),所以要用轉義: htmlspecialchars函數,mysql_read_escape_string函數都可以實現。
4)JS段驗證表單了,JSP/PHP等後台還要驗證碼?
---需要,因為friebug可以禁用JS...
--------------------------------------------------------------------------
update:
上面的方法,當password通過md5加密的話,就無法實現注入了,那麼就在username上做手腳:
username後面的內容就都被注釋掉了。哈哈~
參考:http://newaurora.pixnet.net/blog/post/166231341-sql-injection-%E7%AF%84%E4%BE%8B(%E7%99%BB%E5%85%A5%E7%AF%84%E4%BE%8B)
by wusuopuBUPT
手把手叫你SQL注入攻防(PHP文法)