這個問題一直困擾我許久,今天終于解決清楚了
問題1:eval的執行是否需要雙引號包括:
先看三個命令:
1
2
3
4
|
a:<?php eval (system( dir ))?> b:<?php $cmd = "system(dir)" ; eval ($cmd)?> |
a結果:
b結果:
報錯
思考:
同樣是一個命令,為什么會出現如此區別,詢問了其他師傅得知:eval執行的是變量的值的時候,該變量值需要閉合,也就是必須是一個完整的語句,需要用分號結尾。根據這個道原理我們改一下上面的命令看看:
1
2
3
|
<?php $cmd = "system(dir);" ; eval ($cmd)?> |
結果:
發現是可以執行的。
后話:
關于這個點,還需要補充一個:
內置函數在eval里面直接執行時不需要加分號,看兩個命令就知道了:
1
2
|
eval (system( dir )); eval (system( dir );); |
內置函數不需要加分號,其實我覺得加不加分號都一樣,因為加了分號就要加引號,引號也帶有解析的意思
理解一下命令執行中的閉合:
看代碼:
1
2
|
eval (system( dir )); eval (system( dir );); |
看看結果:
這里可以并且后面語句是不影響解析的
1
2
3
|
<?php eval ( "system(dir);?>xyusaiqeqcyuqqwdnoqcq" ); ?> |
我們這里都是不影響的,為什么?
如果我們是簡單的閉合eval這個命令
那我們的playload應該是:
1
2
3
4
5
6
7
8
|
<?php eval ( "system(dir));?>xyusaiqeqcyuqqwdnoqcq" ); ?> 上面的代碼我錯誤的理解成: <?php eval ( "system(dir)" );?> xyusaiqeqcyuqqwdnoqcq"); ?> |
之前我錯誤的以為是這樣的閉合的,但是后來發現我錯了,直到在有一道題目中我發現這樣閉合不了,后面詢問了一下其他師傅,得到答案:
eval()這個函數可以理解成我們是將eval(字符串)這里面的字符串放到了一個新的php里面去運行,這個新的php本來就又 <?php 所以當我們傳入 system(dir);?>dasdas的時候,?>就以及階段了php代碼
學習了~
原文鏈接:https://blog.csdn.net/weixin_51353029/article/details/118400041