php에서의 포인터

c와 php에서 포인터는 비슷하다.
하지만 가끔 헷갈리는 경우가 있는데..
조심해야되는 경우가 있다.
c처럼 생각하고 포인터를 썼다가는 큰일이 날지도 모른다는 생각에 정리해둔다.
(고수들은 이미 다 알고 있는 사실일지도 모르지만 -ㅅ- 나같이 삽질하는 초보들을 위해 정리한다)

int *p;
int a;

a = 10;

p = &a;
*p = 5;


을 php코드로 짜면 다음과 같이 될 것이다.

$a = 10;
$p = &$a;
$p = 5;


하지만 다음은 어떨까?

int *p;
int *p2;
int a;

a = 10;

p = &a;
p2 = p;
*p2 = 5;


c에서는 a가 5로 바뀐다.

php에서는..

$a = 10;
$p = &$a;
$p2 = $p;
$p2 = 5;


라고 하면?
c로 따지면 $p는 int*이지만, $p2는 int가 된다.
즉, $p2 = $p 하는 순간 p2 = *p; 와같은 식이 되어버리고 만다는것.
이걸을 방지하기 위해 $p2가 포인터 변수라는것을 알려주기 위해 다음과 같이 바꾼다.

$a = 10;
$p = &$a;
$p2 = &$p;
$p2 = 5;


$p앞에 &를 붙이면 $p2가 포인터 변수라는것을 알려주기 때문에 원하는 결과를 얻을 수 있다.

함수의 경우, 인자를 보내는쪽(?)이나 받는쪽에서 &를 붙이게 되면 자연스럽게 둘중 하나가 포인터 같이 사용될 수 있다.
예를들어

$a = 2;

myf(&$a);

function myf($b)
{
	$b = 10;
}


와 같은 코드가 있다면 $a의 값이 10으로 바뀐다. 반대로

$a = 2;

myf($a);

function myf(&$b)
{
	$b = 10;
}


라고 해도 마찬가지의 결과를 얻을 수 있다. 물론 둘다 &라고 해도 정상적으로 된다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/06/09 11:53 2007/06/09 11:53
, ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/100

ZeroBoard 취약점

제로보드 pl8에서 취약점이 발견 되었다.
이상한건.. 이 취약점에 대해서 언급이 전혀 되어 있질 않고 패치 파일 하나만 달랑 있는것이다..

그렇다면 무엇인 문제일까???

우선 패치된 부분을 보자.

기존 소스 (download.php)
mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'");


패치된 소스 (download.php)
if($filenum==1) {
  mysql_query("update `$t_board"."_$id` set download1=download1+1 where no='$no'");
} else {
  mysql_query("update `$t_board"."_$id` set download2=download2+1 where no='$no'");
}


달라진 부분은 $filenum 을 사용하는 곳인데..
이 변수를 필터링 하지 않는다는 것이다.
(zeroboard의 가장 큰 실수는 get방식을 쓰면서 필터링을 안한다는거..)

내가 사용하고 있는 php + mysql 버전에서는 쿼리를 한번에 2개 이상 날릴 수 없으므로
(기존의 php + mysql 조합에서 한번에 쿼리를 한번씩만 날릴 수 있는걸로 알고 있으며(최소한 내가 알기로는 그렇다), 실제로 시도해봐도 되지 않는다. 아니라면 리플 바람)
보면 그리 큰 문제가 될꺼 같진 않지만..

그렇다면 이제부터 간단한 공격을 시작해보자.

http://victim/zb_path/download.php?id=board_id&no=article_no&............filenum=1=99999 where no=article_no --&HTTP_REFERER=http://victim


filenum에 1또는 2, 그 뒤에 오는 99999는 download 횟수, article_no는 실제 게시물 번호.. 등등이다.
HTTP_REFERER는 zb에서 체크하기 때문에 임의대로 넣어줘야 한다.

이렇게 하면 게시물의 download 횟수가 99999로 바뀐것을 볼 수 있다.

자, 그렇다면 이게 다인가?..
조회수 올리기 위해서 이짓거리를 해야 하는가?
이런 의문이 든다면.. 지금 당장 zb설치 후 mysql에 들어가서..

describe zetyx_board_board_id;


라고 쳐보자.. 아이디어가 떠오르지 않는가..ㅋㅋ
처음에는 큰 문제가 될꺼 같지 않게 보여도 이걸 보면 많은 문제가 된다.
아마도 이런 문제들이 큰 파급효과를 일으키지 않을까 싶어서... 공개를 안한게 아닐까... 하는 생각이다.
(단순히 귀찮아서 안했을지도-_-)
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/03/16 08:30 2007/03/16 08:30
, , , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/75

갈등 때린다

php와 mysql에서 한글이 지원이 된다!
php에서 한글 이름의 변수 및 한글 이름의 함수를 짤 수 있다는 사실.

지금 하고 있는 프로젝트의 성격 상
변수 이름을 지으려면 "xx의 xx" 와 같은 변수가 많아져야 한다.
변수 이름이 길어짐은 물론 영어사전을 뒤져봐야 되는 어려움이 따르는데..

그래서 한글 변수 이름을 써볼까 생각중이다.
물론 변수 이름은 영어고, 안에 있는 array의 index가 한글로 써야겠지.

<?
$a['첫번째'] = 10;
?>


와 같은 식으로 말이다.
이번에 써보고 나쁘면 앞으로 쓰지 말아야지 -ㅅ-

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2006/12/14 12:38 2006/12/14 12:38
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/46


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

Calendar

«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
1973446
Today:
5270
Yesterday:
5236