|
先來(lái)說(shuō)說(shuō)php變量的命名規(guī)則,百度下一抓一大把:
(1) php的變量名區(qū)分大小寫(xiě);
(2) 變量名必須以美元符號(hào)$開(kāi)始;
(3) 變量名開(kāi)頭可以以下劃線開(kāi)始;
(4) 變量名不能以數(shù)字字符開(kāi)頭.
其實(shí)所有編程都類似的命名規(guī)范就是:
1. 變量第一個(gè)字符最好是 字母或_,不能以數(shù)字開(kāi)頭
2. 第二個(gè)字符開(kāi)始允許 數(shù)字,字母,_
好了,差不多就是這樣了,但是這不是我們要說(shuō)的重點(diǎn)。
今天我們說(shuō)說(shuō) php 變量的可用字符,不僅僅是 數(shù)字,字母,_ 哦。
前幾天QQ上一朋友發(fā)我一個(gè)shell,是加密過(guò)的,通篇亂碼,不過(guò)上面有注釋,叫做 “神盾加密” 好霸氣的樣子。
里面用了一些比較生僻的知識(shí)點(diǎn),其中最明顯的就是變量名,所以今天我們先從變量開(kāi)始講。
當(dāng)然網(wǎng)上我也沒(méi)找到權(quán)威的質(zhì)料強(qiáng)有力的說(shuō)明php的變量名可用字符的信息,所以我只能自己測(cè)試了。(英文不好,沒(méi)辦法谷歌到有利的證據(jù))
先來(lái)看下我所用的方法,(如果你有更好的方法,希望分享下。)
復(fù)制代碼 代碼如下:
<?php
if ($_POST) {
$chr = chr($_POST['chr']);
eval('$'.$chr."=1;");
echo 'ok';
exit;
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script>
</head>
<body>
<script>
for(var i = 0x00; i <= 0xFF; i++) { // 0x00 - 0xFF 255個(gè)字符
$.ajaxSettings.async = false; // 同步模式, 為了按順序返回?cái)?shù)據(jù)
$.post( "?", {chr: i}, (function (data) { // post i 給 php 解析
data === 'ok' && console.log( "http://x"+(i).toString(16) ); // 如果只返回 ok 說(shuō)明能正常執(zhí)行,否則會(huì)拋出異常
});
}
</script>
</body>
</html>
代碼還算比較簡(jiǎn)單,php 部分只負(fù)責(zé)解析每一個(gè)字符當(dāng)作變量名的執(zhí)行結(jié)果是否會(huì)拋出溢出。
比如 字符 a 那么會(huì)解析 eval('$a=1;'); 這樣的結(jié)果肯定沒(méi)問(wèn)題,所以不會(huì)拋出異常,返回結(jié)果就是 ok 字符。
如果 字符 - 那么會(huì)解析 eval('$-=1;'); 這明顯是不對(duì)的,所以會(huì)拋出 php Parse error: syntax error, unexpected '-', expecting T_VARIABLE or '$' 和 ok 字符。
而下面的 ajax 部分者正是利用返回結(jié)果是否為 'ok' 而判斷是否是有效的變量名。
看看執(zhí)行后的結(jié)果是什么吧:
復(fù)制代碼 代碼如下:
"/x41, /x42, /x43, /x44, /x45, /x46, /x47, /x48, /x49, /x4a, /x4b, /x4c, /x4d, /x4e, /x4f, /x50, /x51, /x52, /x53, /x54, /x55, /x56, /x57, /x58, /x59, /x5a, /x5f, /x61, /x62, /x63, /x64, /x65, /x66, /x67, /x68, /x69, /x6a, /x6b, /x6c, /x6d, /x6e, /x6f, /x70, /x71, /x72, /x73, /x74, /x75, /x76, /x77, /x78, /x79, /x7a, /x7f, /x80, /x81, /x82, /x83, /x84, /x85, /x86, /x87, /x88, /x89, /x8a, /x8b, /x8c, /x8d, /x8e, /x8f, /x90, /x91, /x92, /x93, /x94, /x95, /x96, /x97, /x98, /x99, /x9a, /x9b, /x9c, /x9d, /x9e, /x9f, /xa0, /xa1, /xa2, /xa3, /xa4, /xa5, /xa6, /xa7, /xa8, /xa9, /xaa, /xab, /xac, /xad, /xae, /xaf, /xb0, /xb1, /xb2, /xb3, /xb4, /xb5, /xb6, /xb7, /xb8, /xb9, /xba, /xbb, /xbc, /xbd, /xbe, /xbf, /xc0, /xc1, /xc2, /xc3, /xc4, /xc5, /xc6, /xc7, /xc8, /xc9, /xca, /xcb, /xcc, /xcd, /xce, /xcf, /xd0, /xd1, /xd2, /xd3, /xd4, /xd5, /xd6, /xd7, /xd8, /xd9, /xda, /xdb, /xdc, /xdd, /xde, /xdf, /xe0, /xe1, /xe2, /xe3, /xe4, /xe5, /xe6, /xe7, /xe8, /xe9, /xea, /xeb, /xec, /xed, /xee, /xef, /xf0, /xf1, /xf2, /xf3, /xf4, /xf5, /xf6, /xf7, /xf8, /xf9, /xfa, /xfb, /xfc, /xfd, /xfe, /xff"
整理后發(fā)現(xiàn)是這樣的16進(jìn)制數(shù)據(jù),當(dāng)然看不懂沒(méi)關(guān)系,看下轉(zhuǎn)義后的結(jié)果:
復(fù)制代碼 代碼如下:
"A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, , ®, ¯, °, ±, ², ³, ´, µ, ¶, ?, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, ÿ"
除了前面的 A-Z_a-z 是我們熟悉的,后面的那些亂七八糟的東西竟然也能當(dāng)作正常的變量名,簡(jiǎn)直不可思議。
其實(shí)只是php拓展了變量名的字符范圍,在 A-Z_a-z 之上,將變量可用字符范圍拓展到了 /x7f-/xff。
所以,第一個(gè)字符范圍應(yīng)該是 [a-zA-Z_/x7f-/xff]
那么第二個(gè)字符是否也是這樣能,我們繼續(xù)測(cè)試下。
將上面 php 代碼里的 eval('$'.$chr."=1;"); 改成 eval('$a'.$chr."=1;"); 保存測(cè)試、
復(fù)制代碼 代碼如下:
"/x9, /xa, /xd, /x20, /x30, /x31, /x32, /x33, /x34, /x35, /x36, /x37, /x38, /x39, /x41, /x42, /x43, /x44, /x45, /x46, /x47, /x48, /x49, /x4a, /x4b, /x4c, /x4d, /x4e, /x4f, /x50, /x51, /x52, /x53, /x54, /x55, /x56, /x57, /x58, /x59, /x5a, /x5f, /x61, /x62, /x63, /x64, /x65, /x66, /x67, /x68, /x69, /x6a, /x6b, /x6c, /x6d, /x6e, /x6f, /x70, /x71, /x72, /x73, /x74, /x75, /x76, /x77, /x78, /x79, /x7a, /x7f, /x80, /x81, /x82, /x83, /x84, /x85, /x86, /x87, /x88, /x89, /x8a, /x8b, /x8c, /x8d, /x8e, /x8f, /x90, /x91, /x92, /x93, /x94, /x95, /x96, /x97, /x98, /x99, /x9a, /x9b, /x9c, /x9d, /x9e, /x9f, /xa0, /xa1, /xa2, /xa3, /xa4, /xa5, /xa6, /xa7, /xa8, /xa9, /xaa, /xab, /xac, /xad, /xae, /xaf, /xb0, /xb1, /xb2, /xb3, /xb4, /xb5, /xb6, /xb7, /xb8, /xb9, /xba, /xbb, /xbc, /xbd, /xbe, /xbf, /xc0, /xc1, /xc2, /xc3, /xc4, /xc5, /xc6, /xc7, /xc8, /xc9, /xca, /xcb, /xcc, /xcd, /xce, /xcf, /xd0, /xd1, /xd2, /xd3, /xd4, /xd5, /xd6, /xd7, /xd8, /xd9, /xda, /xdb, /xdc, /xdd, /xde, /xdf, /xe0, /xe1, /xe2, /xe3, /xe4, /xe5, /xe6, /xe7, /xe8, /xe9, /xea, /xeb, /xec, /xed, /xee, /xef, /xf0, /xf1, /xf2, /xf3, /xf4, /xf5, /xf6, /xf7, /xf8, /xf9, /xfa, /xfb, /xfc, /xfd, /xfe, /xff"
發(fā)現(xiàn)結(jié)果多了好多字符,其實(shí)有一部分我們是要去掉的,比如 /x20 其實(shí)就是 空格,相當(dāng)于 eval('$a =1;'); 而已,當(dāng)然是能正常執(zhí)行的。
除了空格,還有 /t/r/n 都去掉因?yàn)檫@些也是php語(yǔ)法說(shuō)允許的 /t=/x9,/n=/xa,/r=/xd,所以我們要去掉結(jié)果中的前4個(gè)數(shù)據(jù)/x9, /xa, /xd, /x20,
最終得到的結(jié)果其實(shí)只是多了 /x30, /x31, /x32, /x33, /x34, /x35, /x36, /x37, /x38, /x39 熟悉 ascii 的人也許一眼就看出來(lái)了,這就是數(shù)字 0-9
所以第一個(gè)字符范圍應(yīng)該是 [/w/x7f-/xff] 對(duì)正則不熟的也許會(huì)覺(jué)得怎么不是 [0-9a-zA-Z_/x7f-/xff],其實(shí) /w 就是 0-9a-zA-Z_
也許有人會(huì)說(shuō) $$a; ${$a}; 這樣的變量呢?
我覺(jué)得這個(gè)已脫離了變量命名的范圍了,不是么。
好了,關(guān)于 php 變量可用字符的知識(shí)點(diǎn)分享完畢了,如果有哪說(shuō)的不對(duì)的,請(qǐng)留言,我會(huì)及時(shí)改正以免誤導(dǎo)大家。
我的猜測(cè): ascii 范圍 0-127(/x00-/x7f), latin1 范圍 0-255(/x00-/xff),也許php就是將范圍擴(kuò)充到 latin1 字符集了,當(dāng)然我沒(méi)看過(guò)php源碼,只能說(shuō)是個(gè)猜想而已。
php技術(shù):神盾加密解密教程(一)PHP變量可用字符,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。