編程基礎 | PHP代碼審記(上 )

紅日安全推出的適合新手入門系列教程專刊上線啦!紅日安全專一新手入門教程。轉眼間紅日安全又成長了一歲,在這一年裏,團隊成長了不少不少。目前團隊全部的文章對外都是公開的,但願能夠給新手一個填補空白的地方。2020年,團隊開始新的方向,和一些安全培訓廠商進行合做,但願作出更多安全做品。感謝團隊每一位成員爲團隊的辛勤付出,但願每個人在團隊裏面有更大的做爲。也感謝一直在後面默默支持咱們的紅粉,也祝願大家在新的一年學到更多的乾貨!php

1.1 PHP安全入門到精通
1.1.1 概述

PHP安全入門到精通書刊,年後所有放出。爲了團隊發展,我的在閒暇時間爲團隊作了一個PHP安全入門到精通書籍,本次書籍摘出一部分讓你們入門,更詳細的會在年後發出,這次書籍但願讓沒有基礎的安全人員也能夠寫本身網站,搭建本身的PHP工具和PHP靶場平臺。本次專刊發表幾節,由於總體文章尚未寫完,因此先放出一部分供你們學習。後續文章在年後第二次專刊將在此奉獻,但願你們在新的一年裏,學習到更多的技能。所有內容以下:html

v2-47aa4c782cf876d8fb591e7ac2725e4c_1440w.jpg

1.1.2 PHP基礎知識java

1.1.2.1 全局變量認識mysql

1.1.2.1.1 $GLOBALSios

globals是PHP內置的能夠自動獲取當前頁面中的全部變量的內容.web

代碼解釋正則表達式


v2-dddc66c9dc9bd256b42c4f9ad52dec4b_1440w.jpgv2-522cc074ba597fd0204fac1c6f2d1ec2_1440w.jpgv2-826ef84296ccb088b29f1208f27fb50d_1440w.jpg

1.1.2.1.2 $_SERVERredis

$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由Web 服務器建立。不能保證每一個服務器都提供所有項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。sql

代碼解釋:mongodb

echo '';foreach($_SERVER as $key  =>$value){echo '';echo ''.$key.''.''.$value.'';echo '';}echo '';?>


v2-c6bb96125d22f51174c48b02123a2e38_1440w.jpg

1.1.2.1.3 $_FILES

說明:獲取上傳文件的信息代碼說明:hr.html

紅日安全文件名:

Hr.php

  0){echo "錯誤:: " . $_FILES["file"]["error"] . "";}else{echo "上傳文件名: " . $_FILES["file"]["name"] . "";echo "文件類型: " . $_FILES["file"]["type"] . "";echo "文件大小: " . ($_FILES["file"]["size"] / 1024) .  "kB";echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"] ."";// 判斷當期目錄下的 upload  目錄是否存在該文件// 若是沒有 upload 目錄,你須要建立它,upload 目錄權限爲  777if (file_exists("upload/" . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " 文件已經存在。 ";}else{// 若是 upload 目錄不存在該文件則將文件上傳到 upload  目錄下move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);echo "文件存儲在: " . "upload/"  .$_FILES["file"]["name"];}}}else{echo "非法的文件格式";}?>

1.1.2.1.4 $_GET:URL方式傳遞數據

說明:其實就是瀏覽器的地址欄傳遞方式,傳遞方式:URL地址?參數1=值1&參數2=值2……………………………傳遞形式:表單的get方式和超連接方式

代碼解釋:

USERNAME:PASSWORD:

$_GET方式是在URL地址欄裏面直接對接傳輸。

v2-778867de2eae95ae72e1ee8ac6cce9b1_1440w.jpg

1.1.2.1.5 $_POST: HTTP POST方式傳遞數據

說明:經過HTTP協議的post方式來傳遞數據。POST方式傳輸是在地址欄裏面看不見地址,例如隱式傳輸。利用谷歌瀏覽器查看。

USERNAME:PASSWORD:

1.1.2.1.6 $_REQUEST

v2-dd340799eb6e5817330404b8a1d22084_1440w.jpgv2-2b088f50443b2f139670ce01945afc85_1440w.jpg

默認三種方式均可以提交。若是設置接受get方式,咱們以POST方式進行提交,瀏覽器會找不到該值。1.1.3二正則表達式

1.1.3.1 正則表達式入門1.1.3.1.1 入門簡介

在編寫處理字符串的程序或網頁時,常常會有查找符合某些複雜規則的字符串的須要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。極可能你使用過Windows/Dos下用於文件查找的通配符(wildcard),也就是和?。若是你想查找某個目錄下的全部的Word文檔的話,你會搜索.doc。在這裏,*會被解釋成任意的字符串。和通配符相似,正則表達式也是用來進行文本匹配的工具,只不過比起通配符,它能更精確地描述你的需求——固然,代價就是更復雜——好比你能夠編寫一個正則表達式,用來查找全部以0開頭,後面跟着2-3個數字,而後是一個連字號「-」,最後是7或8位數字的字符串(像010-12345678或0376-7654321)。正則表達式就像篩子,將咱們須要的內容(符合規則的內容)漏下去,將不符合規則的內容過濾掉而咱們學習正則表達式,主要是如何定義這一套規則1.1.3.2 正則表達式相關的函數

1) preg_match使用正則表達式(規則)對字符串進行篩選,篩選到一個結果即中止

v2-12a3382abab59a2847bf40db19cc9121_1440w.jpg

2) preg_match_all使用正則表達式(規則)對字符串進行篩選,篩選到結果先保存到數組,並繼續篩選,直到字符串結束

v2-16ae4de082cfd491fb7b8ad3ae891157_1440w.jpg

3) preg_replace使用正則表達式(規則)對字符串進行篩選,再將篩選的內容進行替換

v2-d65508b529b01b5f29ad02c594701b2e_1440w.jpg

4) preg_split使用正則表達式(規則)對字符串進行拆分explode()是根據某個字符進行分割

v2-67eec767431c021c1296857a3a63e4f3_1440w.jpg

使用 preg_split 能夠先根據定義的規則進行篩選,再根據篩選的結果拆分字符串

v2-bfe473f6bdadb3750a01cdceb2dd6ccf_1440w.jpg

1.1.3.3 正則表達式應用場景

用戶註冊時,先定義用戶名的規則(字母、數字、下劃線的組合,6-10位),而後再使用該規則驗證用戶的輸入

v2-2e9ff93c5caebf8f7e078cb0ae738590_1440w.jpg

內容採集(將其餘網站的內容採集下來,保存到咱們的數據庫),須要告訴程序須要哪些內容(定義好規則)1.1.3.4 表達式語法

定界符:表示規則的邊界,從哪裏開始到哪裏結束

v2-d467da728899907f59fd1a7bffea866e_1440w.jpg

元字符:元字符就表示篩選的內容(一個字符)例如:咱們可使用一個字符表示篩選的就是這個字符

$reg='/W/';$str='helloWorld';preg_match($reg,$str,$match);var_dump($match);

v2-014d44e7352359037961fe07a31e32af_1440w.jpg

除了使用一個字符表示篩選的字符以外,正則表達式還提供了一些特殊的符號表示篩選的內容例如:可使用轉義字符表示篩選範圍中的一個\w 表示篩選的內容是字母、數字、下劃線中的任意一個\W \w的反義詞,表示除了字母、數字、下劃線以外的任意一個字符

v2-c12f76bd0f8891888719224e55fe7179_1440w.jpgv2-4592298220f128cb023b5b385aa66022_1440w.jpg

\d,表示篩選數字(0-9)範圍中的任意一個

\D,表示除了數字以外的任意一個字符

v2-35262b0be254c8fc8d2a4569a4f1070b_1440w.jpg

\s:space空格\S:除了空格以外的任意一個字符

v2-bf7ac0849040cb7df11c5a34c535282a_1440w.jpg

表示**中的任意一個字符[a-z],小寫的a到小寫的z之間的任意一個字符[hel],表示hel這幾個字母之間的任意一個[^hel],中括號裏面的^表示非,除了hel以外的任意一個字符

v2-8247112448727ac49342f816d6505d64_1440w.jpgv2-483e294e9108ef11b83766b676ed8284_1440w.jpgv2-d96219d176a61e85402d5548e70650ee_1440w.jpg

英文的點號,表示除了換行符以外的任意一個字符

v2-494912a9828e702686b54f4dd8b010d1_1440w.jpg

|豎線,表示 或者

v2-f9a9c583cb88888f619faba2fbbceb8c_1440w.jpg

量詞默認狀況下,正則表達式採用的是貪婪模式(儘量多的匹配)量詞表示元字符的數量,也就是篩選的內容的長度{m},固定數量m個{n,m},表示最少n個,最多m個{n,} ,表示最少n個,最多無窮個*,表示0個或多個+,表示至少1個?,表示0個或1個

v2-a901d72e24c2ea8488f3d257b0081136_1440w.jpg

? 的特殊使用? 若是放在元字符後面,表示0個或1個,可是若是放在量詞的後面表示將貪婪模式修改成懶惰模式(儘量少的匹配)舉例說明:

v2-b157ba43abb34d83619490522ee89e1f_1440w.jpgv2-f946cb60ab403df939e72a0490617fa4_1440w.jpg

^ $ 表示從開始到結束

v2-4470fb7ab6217154725ae0cdf7a81f99_1440w.jpg

模式修正符模式修正符,用來對前面的正則表達式進行修飾做用1) i忽略大小寫沒有使用i模式修正符的時候

使用i模式修正符,表示忽略大小寫

v2-dd2fa8a6c26b791a4d52659679e463dd_1440w.jpg

2) s,表示萬能點模式沒有使用s修飾符的代碼

v2-3a8fceb9e907224b9900fcf786e4213d_1440w.jpg

使用s之後

v2-641d780fa10e882fba8855b857d7dcd9_1440w.jpg

3) U,表示將貪婪模式修改懶惰模式

默認是貪婪模式,就會盡量多的去匹配

v2-f1409f8d172cec680a2e3640bf292483_1440w.jpg

4) 分組的使用使用正則表達式進行匹配的時候,可使用()將須要的內容括起來,每一個小括號的內容就會當作一個小組,並保存到數組中。第一個()的內容會保存到數組下標爲1的元素中第二個()的內容會保存到數組下標爲2個元素中以此類推Ÿ $res=‘/<a.+href=」(.+)」>(.+)<\/a>/’;篩選URL

v2-542f92777749f6d20c72ddbc0a7daf68_1440w.jpgv2-5d67768afa8ba76be93ca3ff1e5316a2_1440w.jpg

1.1.3.5 正則實例

用戶名驗證

6-30位,字母、數字、下劃線組合,字母開頭

$reg='/^[a-zA-Z]\w{5-29}$/';$res='ehllo1123';preg_match($reg,$res,$match);if($match){echo "success";}else{echo "fail";}

v2-0c5d929915bc3c2afe780fe77d4458a5_1440w.jpg

手機號驗證

使用正則表達式(規則)對字符串進行篩選,篩選到一個結果即中止

v2-5b765068f67b36f72e98d6bdbb51d7a9_1440w.jpg

密碼驗證

6-20位,字母、數字或符號若是純字母、純數字的話,提示密碼太簡單了若是字母、數字的組合的話,提示密碼比較安全若是是字母、數字、特殊符號的組合,提示密碼槓槓的

v2-93c0e7d8a9c04d012f3bdcb18b8c5509_1440w.jpg

郵箱驗證

郵箱沒有固定的規則,該規則本身定,能夠參考下面的合法的郵箱,本身定義規則

v2-c96dcce6e1a9f72fefd0b1ebed929747_1440w.jpg

正則漏洞

$ip = '1.1.1.1  abcd'; //  能夠繞過if(!preg_match("/(\d+).(\d+).(\d+).(\d+)/",$ip)) {die('error');} else  {echo('key...');}

在這裏沒有限制開始和結束,致使輸入危險字符繞過。n 第二個案例利用\s空格在shell環境下執行命令成功。

$file_name = $_GET["path"];if(!pregmatch("/^[/a-zA-Z0-9-s]+.rpt$/m", $file_name))  {echo "regex failed";} else  {echo exec("/usr/bin/file -i -b " .  $file_name);}

v2-049c239b465808366618c266e18fd533_1440w.jpg

n 第三個正則案例

blog.chaitin.cn/phpmail
1.1.4 socket函數講解1.1.4.1 socket 介紹Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。相同的有MySQL等相似操做,而MySQL它只是已經封裝好了,咱們直接調用就能夠。鏈接服務端,輸入帳號和密碼就能夠。而socket貌似只給咱們提供了一堆函數。經過函數咱們能夠去直接利用。關於socket,咱們講兩種方案,一種是基於內核的socket,另一種是PHP擴展帶有的socket功能。l 基於內核的socketŸ fsockopenŸ pfsockopenl PHP擴展模塊帶有的socket功能Ÿ socket_createŸ socket_bindŸ socket_connectŸ socket_accept首先先講關於擴展模塊socket功能。Socket鏈接圖(圖片來源於網絡),其實和Python原理是同樣的。

v2-2506a1a9fef3dcf25427dbc4457b97dd_1440w.jpg

Ÿ socket關鍵函數—socket_create()socket的關鍵函數1:socket_create($net參數1,$stream參數2,$protocol參數3)做用:建立一個socket套接字,說白了,就是一個網絡數據流。返回值:一個套接字,或者是false,參數錯誤發出E_WARNING警告Ÿ socket關鍵函數—socket_connect()socket_connect($socket參數1,$ip參數2,$port參數3)做用:鏈接一個套接字,返回值爲true或者false參數1:socket_create的函數返回值參數2:ip地址參數3:端口號Ÿ socket關鍵函數—socket_bind()socket_bind($socket參數1,$ip參數2,$port參數3)做用:綁定一個套接字,返回值爲true或者false參數1:socket_create的函數返回值參數2:ip地址參數3:端口號Ÿ socket關鍵函數—socket_listen()socket_listen($socket參數1,$backlog 參數2)做用:監聽一個套接字,返回值爲true或者false參數1:socket_create的函數返回值參數2:最大監聽套接字個數Ÿ socket關鍵函數—socket_accept ()socket_accept($socket)做用:接收套接字的資源信息,成功返回套接字的信息資源,失敗爲false參數:socket_create的函數返回值Ÿ socket關鍵函數—socket_read ()socket_read($socket參數1,$length參數2)做用:讀取套接字的資源信息,返回值:成功把套接字的資源轉化爲字符串信息,失敗爲false參數1:socket_create或者socket_accept的函數返回值參數2:讀取的字符串的長度Ÿ socket關鍵函數—socket_wrete ()socket_write($socket參數1,$msg參數2,$strlen參數3)做用:把數據寫入套接字中返回值:成功返回字符串的字節長度,失敗爲false參數1:socket_create或者socket_accept的函數返回值參數2:字符串參數3:字符串的長度Ÿ socket關鍵函數—socket_close ()socket_close($socket)做用:關閉套接字返回值:成功返回true,失敗爲false參數:socket_create或者socket_accept的函數返回值函數講解完成之後,咱們須要對socket創建服務端和客戶端。首先一下是創建服務端。

Server_socket.php

小提示:請注意上面的socket_bind,socket_listen,socket_accept三個函數的執行順序不可更改,也就是說必須先執行socket_bind,再執行socket_listen,最後才執行socket_accept客戶端代碼Client_server.php 1, "usec" =>  0));//發送套接流的最大超時時間爲6秒socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=> 6, "usec" =>  0));/*設置socket鏈接選項,這兩個步驟你能夠省略///鏈接服務端的套接流,這一步就是使客戶端與服務器端的套接流創建聯繫if(socket_connect($socket,'127.0.0.1',8888) == false){echo 'connect failmassege:'.socket_strerror(socket_last_error());}else{$message = 'l love you 我愛你 socket';//轉爲GBK編碼,處理亂碼問題,這要看你的編碼狀況而定,每一個人的編碼都不一樣$message = mb_convert_encoding($message,'GBK','UTF-8');//向服務端寫入字符串信息if(socket_write($socket,$message,strlen($message)) ==false){echo'failtowrite'.socket_strerror(socket_last_error());}else{echo 'client write success'.PHP_EOL;//讀取服務端返回來的套接流信息while($callback = socket_read($socket,1024)){echo 'server return message is:'.PHP_EOL.$callback;}}}socket_close($socket);//工做完畢,關閉套接流

1.1.4.2 PHP fsockopen 使用方法講解講解fsockopen函數,主要是後面咱們會講到主機端口掃描,因此這個函數咱們必須講解。上面在講socket編程的時候,已經稍微講解一點fsockopen函數。phpfsockopen是一個很是強大的函數,支持socket編程,可使用fsockopen實現郵件發送等socket程序等等,使用fsockopen須要本身手動拼接出header部分,本文章向你們介紹fsockopen使用方法和實例講解,須要的朋友能夠參考一下。Php fsockopen介紹fsockopen — 打開一個網絡鏈接或者一個Unix套接字鏈接。語法:resource fsockopen ( string $hostname [, int $port = -1 [, int&$errno [, string &$errstr [, float $timeout =ini_get("default_socket_timeout") ]]]] )參數:(1)hostname 若是安裝了OpenSSL,那麼你也許應該在你的主機名地址前面添加訪問協議ssl://或者是tls://,從而可使用基於TCP/IP協議的SSL或者TLS的客戶端鏈接到遠程主機。(2)port 端口號。若是對該參數傳一個-1,則表示不使用端口,例如unix://。(3)errno 若是errno的返回值爲0,並且這個函數的返回值爲 FALSE ,那麼這代表該錯誤發生在套接字鏈接(connect())調用以前,致使鏈接失敗的緣由最大的多是初始化套接字的時候發生了錯誤。(4)errstr 錯誤信息將以字符串的信息返回。(5)timeout 設置鏈接的時限,單位爲秒。返回值:fsockopen() 將返回一個文件句柄,以後能夠被其餘文件類函數調用(例如:fgets() , fgetss() , fwrite() , fclose() 還有 feof() )。若是調用失敗,將返回 FALSE 。

v2-f7c28a20aa340a09e3f7fafc580fb77f_1440w.jpg

更詳細能夠參考手冊。(php.net/manual/zh/funct)案例:嘗試去訪問一個本地80端口,咱們查看一下返回值,有什麼效果。

\n";}else{fputs($fp,"GET / HTTP/1.0\N HOST:127.0.0.1\n\n");while(!feof($fp)){echo fgets($fp,128);}fclose($fp);}

v2-1c8534a9bd1ff87a131a0a06fdb4b3b6_1440w.jpg

和BurpSuite訪問效果相同。

v2-f9c1ea3f132dd5df793047752dda31f2_1440w.jpg

內容顯示效果是同樣的呢。咱們能夠看到若是返回200證實80端口開啓。以這個原理,咱們開始寫一個端口掃描器,利用fsockopen函數。既然測試端口,咱們先看一下常見安全端口和對應屬性通常默認經常使用端口掃描介紹:

3311:3312 kangle主機管理系統3389 遠程登陸4440 rundeck是用java寫的開源工具5672 rabbitMQ5900 VNC6082 varnish 參考WooYun: Varnish HTTP accelerator CLI 未受權訪問易致使網站被直接篡改或者做爲代理進入內網6379 redis 通常無認證,可直接訪問7001 weblogic8080 tomcat8089 jboss8161 activeMQ8649 ganglia集羣系統監控軟件9000 fastcgi服務9090 IBM服務9200,9300 elasticsearch 參考WooYun: 多玩某服務器ElasticSearch命令執行漏洞9999 amg加密版10050 zabbix11211 memcache 未受權訪問27017,28017 mongodb 未受權訪問 mongodb默認無口令登陸3777 大華監控設備50000 sap netweaver遠程命令執行漏洞50060 50070 hahoop、apache hasoop21 默認是ftp端口 主要看是否支持匿名,也能夠跑弱口令22 默認是ssh端口23 默認是telnet端口25 默認是smtp服務53 默認是DNS123 是NTP161,162,8161 snmp服務(8161 IBM一款產品所開放的SNMP)389 ldap團體443 openssl 、hearthleed512,513 rlogin服務或者是exec873 rsync 主要看是否支持匿名,也能夠跑弱口令1433 mssql數據庫1080 socks代理1521 oracle1900 bes默認後臺2049 nfs服務2601,2604 zebra路由 默認密碼zebra2082,2083 cpanel主機管理系統3128,3312 squid代理默認端口,若是沒設置口令極可能就直接漫遊內網了3306 mysql數據庫4899 R-admin 鏈接端4440 rundeck rundeck 參考WooYun: 借用新浪某服務成功漫遊新浪內網8834 nessus4848 glashfish

咱們須要在代碼裏面設置相關數組,設置端口一個數組,而後在設置一個屬性的數組。簡單框架以下

<html>
<title>紅日安全</title>
<body align="center">
<form action="#" method="post">
<h4><b>Please input IP address </b></h4><input  type="text"
name="ip"  />
<input type="submit" name="submit"/>
</form>
</body>
</html>
<?php
$port=$_POST['ip'];
.....
?>

v2-2d1d20efa91497ce200cc15a11440112_1440w.jpg

根據框架,咱們開始補充代碼,進行不斷增強。代碼只是入門級代碼,咱們沒有進過任何修飾。

v2-9388a00c2f6c420a4274fb659a3f6d76_1440w.jpg

首先咱們定義了一個表格頭,內容以下

<table border="1px" align="center">
<tr>
<td>id</td>
<td>Port</td>
<td>Server</td>
<td>Status</td>
</tr>

核心PHP文件以下

<?php
$ip=$_POST['ip'];
if(ip2long($ip)){
$_ip=explode($ip,".");
foreach($_ip as $key =>  $value){
if($value <0 ||  $value>255){
die("Invalid IP");
}
}
//判斷ip地址是否符合,利用兩個函數,一個ip2long函數。另一個利用
explode函數,explode函數主要對ip地址進行分割。ip2long  — 將 IPV4  的
字符串互聯網協議轉換成長整型數字
}
$port=array(
21,
23,
25,
79,
80,
110,
135,
137,
138,
139,
143,
443,
445,
1433,
3306,
);
$msg=array(
'Ftp',
'Telnet',
'Smtp',
'Finger',
'Http',
'Pop3',
'Location Service',
'Netbios-NS',
'Netbios-DGM',
'Netbios-SSN',
'IMAP',
'Https',
'Microsoft-DS',
'MSSQL',
'MYSQL',
'Terminal Services',
);
//定義了兩個數組,一個是端口數組,另一個是對端口的解釋。
foreach($port as $key  =>$value){
echo '<tr>';
echo '<td>'.$key.'</td>';
echo '<td>'.$value.'</td>';
echo '<td>'.$msg[$key].'</td>';
$fp=@fsockopen($ip,$value,$errno,$errstr,1);
$res=$fp?'<span>Open</span>':'<span>Close</span>';
echo '<td>'.$res.'</td>';
}
//主要經過fsockopen這個函數進行判斷端口是否打開,若是爲真則返回
true,爲假則執行false
?>

你怎麼看待紅日發佈的這款新專刊?

你認爲他有爆紅的潛質嘛?

歡迎在評論區留言分享你的觀點和見解

v2-1f5ea65d283db490ca9f2edb2e7cebb2_1440w.jpg

相關文章
相關標籤/搜索