由於某次打ctf比賽,在一道有關正則匹配的題目上卡了很大時間,我發現我在這方面的知識還不是很牢固,所以寫這樣一篇小結來總結。
首先對正則匹配進行一定的了解:
preg_match 函式用於執行匹配正規表示式,搜尋 subject 與 pattern 給定的正規表示式的乙個匹配。函式返回 pattern 的匹配次數,值是 0 次(不匹配)或 1 次,因為 preg_match() 在第一次匹配後 將會停止搜尋。preg_match_all() 不同於此,它會一直搜尋subject 直到到達結尾。如果發生錯誤 preg_match() 返回 false。函式語法為:
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
題目:開啟後,是這樣子滴~
<?php
highlight_file('2.php');
$key='key';
$im= preg_match("/key.*key.key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_get["id"]), $match);
if( $im )
?>
. 匹配除 "\n" 之外的任何單個字元
* 匹配它前面的表示式 0 次或多次,等價於
. 匹配 4 到 7 個任意字元
/ 匹配 /,\ 是為了轉義
[a-z] 匹配所有小寫字母
[:punct:] 匹配任何標點符號
/i 表示不分大小寫
構造字串的時候,暫且把\/.\/認為需要『/任意字元/』的型別
而.*認為需要『乙個單個字元』
構造字串如下:
?id=keybkeyabcdkey:/a/akeya;
即可得到flag。
這個題之前寫過wp的,攻防世界web高階題001-012
現在再將這個題目簡單分析一下:
function $()
"];var n=["a","_h0l","n"];
var r=["g}}
document.write('ok');
delete _;
$ 匹配行尾
^ 匹配行首
所以說所需的字串是以be0f23為開頭,以e98aa$為結尾,同時還要包含233ac和c7be9,起初我把這些字串進行直接疊加,但是結果不對,後來發現這些字元之間有些聯絡,比如,be0f23和33ac可以共用3,其後的c同樣可以共用。傳入進輸入框,即可得到flag。
題目:開啟後,題目是這樣子滴~
flag in the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_get['args']))
eval("var_dump($$args);");
}?>
需要知識:
\w [a-za-z0-9] 數字字母下劃線
\w 匹配單詞字母之外的任意字元,等同於[^0-9a-za-z_]。
$_post [用於接收post提交的資料]
$_get [用於獲取url位址列的引數資料]
$_files [用於檔案就收的處理img 最常見]
$_cookie [用於獲取與setcookie()中的name 值]
$_session [用於儲存session的值或獲取session中的值]
$_request [具有get,post的功能,但比較慢]
server[是預定義伺服器變數的一種,所有server[是預定義伺服器變數的一種,所有_server [是預定義伺服器變數的一種,所有_server開頭的都
$globals [乙個包含了全部變數的全域性組合陣列]
$_env [ 是乙個包含伺服器端環境變數的陣列。它是php中乙個超級全域性變數,我們可以在php 程式的任何地方直接訪問它]
$globals :乙個包含了全部變數的全域性組合陣列,它是php中乙個超級全域性變數,我們可以在php 程式的任何地方直接訪問它,當args=globals時,flag出現。
最後一句eval("var_dump($$args);"),其中的$$args是$($args)可變變數,值為變數$args的值
所以payload:
?args=globals,即可得到flag.
常見的正則匹配:
\d 匹配阿拉伯數字,等同於[0-9]。
\d 匹配阿拉伯數字之外的任意字元,等同於[^0-9]。
\x 匹配十六進製制數字,等同於[0-9a-fa-f]。
\x 匹配十六進製制數字之外的任意字元,等同於[^0-9a-fa-f]。
\t 匹配字元。
\s 匹配空白字元,等同於[ \t],即空格和tab
\s 匹配非空白字元,等同於[^ \t]。
\w [a-za-z0-9] 數字字母下劃線
\w 匹配單詞字母之外的任意字元,等同於[^0-9a-za-z_]。
另外,如果要查詢字元*、.、/等,則需要在前面用 \ 符號,表示這不是元字元,而只是普通字元而已。
\* 匹配 * 字元。
\. 匹配 . 字元。
\/ 匹配 / 字元。
\\ 匹配 \ 字元。
\[ 匹配 [ 字元。
元字元
$ 匹配行尾
^ 匹配行首
\< 匹配單詞詞首
\> 匹配單詞詞尾
CTF中RSA題目的pem檔案處理
需要用到工具opensll 現在版本的kali裡面會自帶openssl pem檔案分析 其中每個元素對應的rsa中的元素 私鑰rsaprivatekey sequence version version,modulus integer,n publicexponent integer,e priva...
js 正則匹配key值 js 正則匹配 小結
js的正規表示式 rge.test str 檢驗目標物件中是否包含匹配模式,並相應的返回true或false rge.source str.search rge 將返回乙個整數值,指明這個匹配距離字串開始的偏移位置。如果沒有找到匹配,則返回 1 str.replace re,function 替換匹...
經典題目 正規表示式匹配
引例 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配。本題可通過動態規劃解決...