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
'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 |