오늘 소개할 빌런은 extract 되시겠다



이게 뭐냐면 1995년에 라스무스가 php 만들었을때 이야기.


라스무스는 걍 url 에서 입력값 들어오는거 체크가 무지 귀찮았음

그래서 하나 생각한것이. global register 라는걸 생각하게됨



그냥 board.php/free?num=1     이라는 주소가 있으면


php 에 요청하면 php 는 num 이라는 변수를 만들어주는거임


코딩할때 신나게 막코딩함


그리고 PHP 에는 7.0 까지 변수를 초기화하지 않아도 되는 특징이 있었고

그시절에는 로그에 경고 한줄 찍 싸고 땡이였음. 


로그 찍: undefined variable $num  ( $num 변수는 초기화 되지 않았습니다.)


근데 뭐가문제냐? 이 두가지가 환장의 콜라보를 하면??

만약에... .... 초기화를 하지 않고 그냥 쓰는 변수가 있다???

근데 그게 중요한체크포인트다???

바로 사고 발생 당첨 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ



여튼 워드프레스에는 많은 사고가있었음

그누보드도 마찬가지였음


PHP 가 라스무스의 손을 떠난지 10년뒤의 PHP 5.4 에는 이 무지막지한 기능을 없애기로함


php  의 설정 ini 에서 더이상 register_global 옵션이 사라지게됨

워드프레스는 그걸 받아들이고 서드파티 제작자들에게 공지를 때림 우리앞으로 그런거 지원안해줌~~



근데 애들이 잔머리 굴림  ext//ract() 함수를 이용해서 사라진기능이랑 똑같은 것을 재현해버림

ext//ract() 는 전달한것을 변수로 만들어주는 함수임


이걸 써서 get, post , 서버정보를 모두 풀어버리는 꼼수를 각각 박아두었고

// 아 디씨가 이 함수들 취약점알고 글에도 못쓰게 막아놨네



1ebec223e0dc2bae61abe9e74683726d31d5a4cbed7589a593a21014f8a7a9058b9a2e3b8f6a5cafb9


웃긴건 이 함수의 경고문은 사람들이 남용하기 시작한뒤에 생김


https://www.php.net/extract

PHP: extract - Manual

Import variables into the current symbol table from an array

www.php.net



그누보드는 이걸 코어에 그대로 박음 common.php 에 있음.



그래서 어디서 왔는지 전혀 알수없는 전역변수 난립이 지속됨

끔찍.