'싱글 쿼터 우회'에 해당되는 글 1건

  1. 2018.02.21 [webhacking.kr] prob45(550pt)
2018. 2. 21. 16:50

## prob45(web, 550pt)


[Main]

 45번 문제는 sql injection 문제라고 문제 페이지에 나와있었습니다. 우선 문제 페이지와 소스코드를 보면 아래 [그림 1], [그림 2]와 같습니다.


[그림 1] 문제 페이지


[그림 2] index.phps


 우선 admin으로 로그인하기 위해 "select id from members where id='$_GET[id]' and pw=md5('$_GET[pw]')" 문에서 sql injection을 시켜 결과 값이 admin이 되도록 해야합니다. 각각의 GET방식의 변수에는 별도의 필터링이 걸려있는데, "select id from members where id='asdf' or id='admin'#' and pw=md5('asdf')"과 같은 식으로 injection을 하면 될 것이라고 생각했습니다. 


 하지만 $_GET[id]에는 admin이 필터링으로 걸려 있기 때문에 "select id from members where id='asdf' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 고쳐 우회할 수 있습니다. 하지만 한 가지 문제가 더 있습니다. php의 설정 중 magic_quotes_gpc가 on으로 되어 있으면 single_quote('), double_quote("), slash(/)가 입력되면 그 앞에 "\"(역슬래시)가 붙어 문자열로 인식시켜주는 sql injection 보호기법 입니다. 그런데 이 문제는 이 보호기법이 걸려있었습니다.


 그래서 이를 우회할 수 있는 취약점이 php의 함수 중 mb_convert_encoding()이라는 함수에 있습니다. 이 함수는 문자열의 인코딩 방식을 변경하는 php 함수입니다. 취약점은 2바이트가 멀티바이트로 인식되어 일반적인 아스키로 표시할 수 없는 문자를 표시하도록 하는 곳에 있습니다. 예를 들면 "%aa\"가 하나의 문자로 인식되어 버리는 것입니다. 


 따라서 "select id from members where id='%aa' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 입력하면 "select id from members where id='%aa\' or id=0x61646d696e#' and pw=md5('asdf')"로 변하면서 "\"(백슬래시)때문에 single quote가 문자열로 인식되는것을 막을 수 있습니다. 이렇게 쿼리를 날리면 아래 [그림 3]과 같이 문제가 풀리게 됩니다.


[그림 3] Conratulations~!


'Wargame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob51(250pt)  (1) 2018.02.21
[webhacking.kr] prob26(100pt)  (0) 2018.02.21
[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
Posted by holinder4S