반응형

eval 함수를 사용하는데, 나름 취약점을 방어하겠다고 영문과 숫자를 입력하지 못하도록 하는 경우가 있을 수 있다.

이런 경우 아래와 같이 특수문자들을 이용하여 취약점을 trigger할 수 있다.


해당 방식은 eval이 입력한 문자열을 php 코드로 인식, 실행한다는 것을 이용하여 가변변수 및 bit 연산자를 이용하여 원하는 문자열을 만들어 실행하는 것이다.


자세한 동작방식은 아래 예시를 보며 확인해보자.


Source Code

<?php

        eval('$_="{";$_=($_^"<").($_^">;").($_^"/");${"_".$_}["_"](${"_".$_}["__"]);');

?>


Analysis

(1) $_="{";

 : _라는 변수에 { 문자열을 선언해준다. 해당 문자열을 기준으로 bit 연산을 하여 원하는 문자열을 만들어줄 것이다.


(2) $_=($_^"<").($_^">;").($_^"/");

 : _라는 변수에 ($_^"<").($_^">;").($_^"/") 연산 결과를 넣어준다. 해당 연산은 (1) 문장에서 선언해준 { 문자를 bit 연산해주는 것이다. 해당 결과는 다음과 같이 GET 문자열이 된다.


조금 더 자세히 분석해보자.


첫번째인 $_^"<"에 대해 이해를 하면 나머지들은 동일한 방식으로 이해하면 된다.

먼저 _ 변수에 선언되어있는 것은 { 문자이며, 이것과 문자 < 를 bit 연산하고 있다.

그 결과 다음과 같이 G라는 문자열이 된다.

{ 문자 : 0x7B = 01111011

> 문자 : 0x3C = 00111100


01111011 ^ 00111100 = 01000111 = 0x47 = G


같은 방식으로 (2) 문장의 결과 _ 변수에는 GET이라는 문자열이 저장된다.


(3) ${"_".$_}["_"](${"_".$_}["__"]);

 : (2) 문장의 결과 _ 변수에는 GET이 들어가있으므로 ${"_".$_}["_"] 는 $_GET["_"]과 동일하다.

 마찬가지로 ${"_".$_}["__"]는 $_GET["__"]과 같으므로 해당 문장은 $_GET["_"]($_GET["__"])과 같다.


Exploit



참고 ) https://blog.silnex.kr/php-non-alphanumeric-code/

반응형

'Hacking > Web' 카테고리의 다른 글

Client-side Vulnerability  (0) 2020.04.02
SQL Injection and filter bypass  (0) 2020.04.01
SQL Injection in INSERT, UPDATE and Delete Statements  (0) 2020.03.06
[root-me] NoSQL injection - Blind  (0) 2020.03.05
[root-me] Local File Inclusion - Wrappers  (0) 2020.03.05
블로그 이미지

rootable

,