eval(cmd)與eval($cmd)的區(qū)別與聯(lián)系
這個問題一直困擾我許久,今天終于解決清楚了
問題1:eval的執(zhí)行是否需要雙引號包括:
先看三個命令:
A:<?php eval(system(dir))?> B:<?php $cmd="system(dir)"; eval($cmd)?>
A結(jié)果:
B結(jié)果:
報錯
思考:
同樣是一個命令,為什么會出現(xiàn)如此區(qū)別,詢問了其他師傅得知:eval執(zhí)行的是變量的值的時候,該變量值需要閉合,也就是必須是一個完整的語句,需要用分號結(jié)尾。根據(jù)這個道原理我們改一下上面的命令看看:
<?php $cmd="system(dir);"; eval($cmd)?>
結(jié)果:
發(fā)現(xiàn)是可以執(zhí)行的。
后話:
關(guān)于這個點,還需要補充一個:
內(nèi)置函數(shù)在eval里面直接執(zhí)行時不需要加分號,看兩個命令就知道了:
eval(system(dir)); eval(system(dir););
內(nèi)置函數(shù)不需要加分號,其實我覺得加不加分號都一樣,因為加了分號就要加引號,引號也帶有解析的意思
理解一下命令執(zhí)行中的閉合:
看代碼:
eval(system(dir)); eval(system(dir););
看看結(jié)果:
這里可以并且后面語句是不影響解析的
<?php eval("system(dir);?>xyusaiqeqcyuqqwdnoqcq"); ?>
我們這里都是不影響的,為什么?
如果我們是簡單的閉合eval這個命令
那我們的playload應(yīng)該是:
<?php eval("system(dir));?>xyusaiqeqcyuqqwdnoqcq"); ?> 上面的代碼我錯誤的理解成: <?php eval("system(dir)");?> xyusaiqeqcyuqqwdnoqcq"); ?>
之前我錯誤的以為是這樣的閉合的,但是后來發(fā)現(xiàn)我錯了,直到在有一道題目中我發(fā)現(xiàn)這樣閉合不了,后面詢問了一下其他師傅,得到答案:
eval()這個函數(shù)可以理解成我們是將eval(字符串)這里面的字符串放到了一個新的php里面去運行,這個新的php本來就又 <?php 所以當(dāng)我們傳入 system(dir);?>dasdas的時候,?>就以及階段了php代碼
學(xué)習(xí)了~
版權(quán)聲明:
本站所有文章和圖片均來自用戶分享和網(wǎng)絡(luò)收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系網(wǎng)站客服處理。