sql注入新手問題?

?name=root"or"1"="1 可以用

但是 ?name=root"or1=1# 不可以。

為什麼呢,是因為沒有空格嗎?井號「#」不是可以注釋掉後面的引號「"」嗎?


逛了這麼久的知乎,終於有個自己能回答的問題了,怒答之!

----------------------邪惡的分割線----------------------

話說這個問題也曾困擾過我一段時間,直到某天腦子一抽,想起來玩xss時看到的一篇集猥瑣之大成的文章---URL Hacking - 前端猥瑣流,頓時一切疑惑煙消雲散(TM的當時恨不得抽自己兩巴掌,虧的自己當初還屁顛屁顛地跑去圖書館看過一本html的書),以下是這篇文章對URL格式的介紹

第一部分:協議名(以單個冒號結束)
第二部分:用戶信息 也就是賬號密碼!(登陸ftp時常用)
第三部分:主機名(也就是域名)
第四部分:埠
第五部分:查詢,這裡有個bug。。。 應該是?號後的內容才是查詢!
第六部分:片段ID(是不會發送到伺服器的!)

重點在第六部分,說得很清楚了,片段ID是不會發送到伺服器的(包括#號).所以想直接使用#去注釋掉後面的引號是不行的,至於解決辦法,樓上已經說得很清楚了,將#轉碼為%23.

在上面曾提到過html,這跟html有什麼關係呢?其實是有關係的,在看到對URL格式介紹時,突然就想起來了,在html中有一個叫錨的東西,也就是#,用法是這個樣子的

錨:&

&

錨點&

&

&錨&

當點擊這個鏈接時,頁面會轉到錨點段落,這時觀察URL,就會發現URL後會出現#anchor,而且細心點的話能發現頁面只是向上(下)滾動到錨點的地方,而沒有出現刷新時的圈圈,說明是沒有伺服器的參與的.

再細心一點的話,你會發現刷知乎的時候,當你點開一個回答,頁面會直接定位到答主所在的樓層,此時URl的後面也會跟上一個#,比如當我點開這個回答時的URL是這樣的http://www.zhihu.com/question/29524696#answer-13591264

總結一下:在URL中#的作用就是一個頁面定位功能,是不會發送到伺服器去的

------------------------邪惡的分割線-------------------------

BTW:題主曾提到是不是沒有空格的原因,想來是因為--注釋符後面要接一個空格的原因吧.我曾經試過,如果不接空格的話,接任意一個字元都是可以的哦,不信你可以試試.

再啰嗦一句,學習sql注入的話,sqli-labs-master是一個不錯的開源平台.


通過抓包可以發現,#號並沒有發送到伺服器。

以下內容引自 URL的井號 - 阮一峰的網路日誌

#代表網頁中的一個位置。其右面的字元,就是該位置的標識符。比如,

http://www.example.com/index.html#print

HTTP請求不包括#

#是用來指導瀏覽器動作的,對伺服器端完全無用。所以,HTTP請求中不包括#。

比如,訪問下面的網址,

Example Domain

瀏覽器實際發出的請求是這樣的:

  GET /index.html HTTP/1.1

  Host: Example Domain

可以看到,只是請求index.html,根本沒有"#print"的部分。

所以,要想發送到伺服器,需要

將#轉碼為%23

即 ?name=root"or1=1%23


對#編碼%23,或者使用"-- ",最後記得有個空格。


推薦閱讀:

如何評價 KoolShare 論壇的 merlin 改版固件?
如果 CPU 存在安全後門,那麼使用國產伺服器能杜絕安全問題嗎?
如何看待「網易郵箱泄密事件」?
15年7月,最近QQ盜號(利用所謂聚會照片)是怎麼回事?這個釣魚網站最近已經見過多次了?
隨著互聯網的發展,哪些網路攻擊手段越來越盛行了?

TAG:網路安全 | SQL注入 |