PHP-代码审计-SQL注入
生活随笔
收集整理的這篇文章主要介紹了
PHP-代码审计-SQL注入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼審計
白盒測試
- 搭建成功后 用WEB漏洞掃描工具
- 利用網站的源碼進行代碼審計
準備工作
- 漏洞參數條件:函數 可控變量
- 列如sql注入
- 函數關鍵字:mysql_connect mysql_select_db mysql_query 等
- 可控變量關鍵字:$_GET $_POST $_REQUEST $_SERVER等
定點漏洞挖掘
- 分析漏洞產生條件
- 得到漏洞關鍵字
- 利用工具查找關鍵字
- 分析文件名進行判斷篩選
- 對文件進行代碼分析 跟蹤變量
- 確定是否存在該漏洞
數據庫監控工具挖掘
- 打開審計插件mysql監控工具
- 輸入mysql賬號密碼點擊下斷和更新
- 登陸要審計的頁面
- 并且吧各個功能點都點一遍
- 回到源代碼審計工具
- 點擊更新
- 看到變量中帶值的的sql語句就可能是注入點
- 復制帶值的sql語句部分
- 粘貼到包含文本,并輸入搜索的文件和范圍,一般文件就是php文件
- 點開一個看起來不像配置文件的文件
- crtl + f 搜索剛剛粘貼的關鍵字
- 找到帶參數id的sql語句
- 如果包含該參數有變量,就需要回調該變量,觀察該變量過濾規則,從觀察是否存在過濾不完整
- dvwa用的isset函數,沒有過濾的意思,所以不必回調
- 所以該頁面沒有任何過濾,存在sql注入
SEAY源代碼工具挖掘
- 首先打開seay源代碼審計工具
- 點擊新建項目導入源碼
- 點擊自動審計
- 可以看到一堆漏洞
- 我們點擊sql注入這個
產生漏洞 條件
- 函數關鍵字:mysql_connect mysql_select_db mysql_query 等
- 可控變量關鍵字:$_GET $_POST $_REQUEST $_SERVER等
- 該沒有可控變量關鍵字,我們假設他有關鍵字$_GET
- 可以看到使用了變量傳入,并且有函數包裹所以我們要回調函數
- 我們復制該函數名
- 在本文中查找該函數
- 可以看到該函數的定義是
- 如果條件存在就將輸入的字符轉義
- 我們查一下該條件到底是什么
- 使用了兩個函數:function_exists()和get_magic_quotes_gpc()
- 第一個是定義是否傳來字符串
- 第二個是定義傳來的銘感字符添加轉義
- 再回到這邊來
- 如果那邊的條件成立,則根本不存在注入
- 因為他規定了輸入必須是字符還有轉義威脅字符
- 所以該位置不存在注入
- 我們現在做一個假設
- 如果沒有必須是字符串的條件
- 他只是過濾了單引號等字符
- 而該sql語句并沒有吧字符寫死在里面
- 則該位置就存在漏洞,因為他過濾的是字符單引號等字符,但是我們可以不用字符,使用整形注入
- 現在假設他真的就存在這么一個漏洞
- 通常情況是觀察該類在那位置實例化,可以是本文,也可以是外部調用,所以本文和外部調用我們都要搜索是否存在
- 我們搜索該類的時候發現沒有任何文件調用(此處無圖),所以他肯定就是在本頁面中使用
三種情況
-
一種是在其他文件實例化,一種是在本文件實例化,還有一種是在類中調用
-
文件實例化:就要通過全文函數搜索,去找到實例化的文件,然后再通過該傳參條件,在外部文件構造sql語句
-
本文件實例化和類中調用都直接在當前文件構造sql語句即可
-
通過在本文搜索,搜索他當前所在的函數
-
發現該函數就是在類中調用
-
找到該語句,根據其條件,構造出利用姿勢
-
如:php?funcName=unique&value=1
-
反正不是盲注就是顯注入或報錯注入
-
觀察應該是盲注
-
如果真的要確定是什么注入就跟一下條件語句中的函數,看他怎么處理即可
這里假設變量都是用get傳參(圖中小紅方塊),因為該源碼沒有吧參數傳遞給用戶,所以將就假設一下,方法都一樣
如
funcName=funcName=funcName=_GET[‘unique’];
value=value=value=_GET[‘unique’];
總結
以上是生活随笔為你收集整理的PHP-代码审计-SQL注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp-Webshell免杀
- 下一篇: PHP-代码审计-审计第一步