sweetchip's blog

webhacking.kr 2건이 검색되었습니다.

이번에는 49번을 풀어보겠습니다.


바로 이 직전에 했던 문제와 98% 비슷한 문제입니다.


약간 필터링이 더해진 것뿐입니다.


힌트만 보실분은 아래에 힌트를 눌러주세요 :D







그러면 바로 소스 분석으로 들어가보겠습니다.


<?
if(time()<1258110000) exit();

if(
$_GET[lv])
{
if(
eregi("union",$_GET[lv])) exit();
if(
eregi("from",$_GET[lv])) exit();
if(
eregi("select",$_GET[lv])) exit();
if(
eregi("or",$_GET[lv])) exit();
if(
eregi("and",$_GET[lv])) exit();
if(
eregi("\(",$_GET[lv])) exit();
if(
eregi("\)",$_GET[lv])) exit();
if(
eregi("limit",$_GET[lv])) exit();
if(
eregi(",",$_GET[lv])) exit();
if(
eregi("/",$_GET[lv])) exit();
if(
eregi("by",$_GET[lv])) exit();
if(
eregi("desc",$_GET[lv])) exit();
if(
eregi("asc",$_GET[lv])) exit();
if(
eregi("cash",$_GET[lv])) exit();
if(
eregi(" ",$_GET[lv])) exit();
if(
eregi("%",$_GET[lv])) exit();
if(
eregi("%09",$_GET[lv])) exit(); // 필터링

$q=@mysql_fetch_array(mysql_query("select id from zmail_member where lv=$_GET[lv]")); 

echo(
$q[0]);
if(
$q[0]=="admin") @solve(); //admin

}

?>


이번에도 역시 매우 간단한 소스들입니다.


하지만 이전 비슷한 문제보다 더 많은 필터링을 하고 있습니다.


우리의 최종목표는 admin으로 접속하는 것입니다.


지난번엔 concat()을 이용해서 admin으로 했지만, 이번에는 ( 도 )도 ',' 도 죄다 필터링을 합니다.


그리고 or 도 필터링하니 말 다했네요 ㅠ-ㅠ


하지만 우회 방법이 있습니다.


프로그래밍을 해본분이라면 다 알만한 || <- or 이라는 뜻입니다.


||의 특징은 or 처럼 띄어쓰기를 하지 않아도 된다는 것입니다.


= 은 따로 필터링 하지 않으니 바꿀 필요는 없습니다.


문제는 admin을 어떻게 집어넣느냐 인데, 바로 Hex 를 이용하면 가능합니다.


0xFF 이런형식으로 집어넣을수 있습니다.


admin => 0x61646d696e


공격 구문을 간단하게 생각해보면


123 or id=admin


이런식으로 하면 됩니다.


위에 말씀드린 것을 바탕으로 시도하면 문제가 풀립니다.


'0x10 정보보안 > 0x16 Web' 카테고리의 다른 글

webhacking.kr 57번  (0) 2012.11.28
Webhacking.kr 55번 중간 풀이.  (10) 2012.11.05
webhacking.kr 49번 write up  (5) 2012.11.05
Webhacking.kr 46번 write up  (2) 2012.11.04
Webhacking.kr 37번 Write up  (2) 2012.11.04
webhacking.kr 45번 write up  (2) 2012.11.02

Comment 5

  • 2013.04.25 18:20 수정 답글

    비밀댓글입니다

    • 2013.04.25 19:03 신고 수정

      확실하짅 않지만.. 아마 띄어쓰기로 넘어가서 그러지 않을까 하네요..
      다른것도 아마 안걸릴겁니다.

  • 2013.05.08 23:35 수정 답글

    비밀댓글입니다

    • 2013.05.10 20:40 신고 수정

      음.. 그것에 대해서는 확실히는 몰라서 정확히 집어서 답변을 드리긴 어려울것 같습니다... ㅠㅠ

  • 2013.11.15 02:08 수정 답글

    비밀댓글입니다


안녕하세요


요즘 sql injection을 주로 공부중인데 이거 참 정말 어렵네요 ㅋㅋ


뭐 이리 쿼리들이 어려운지 참.. ㅠ-ㅠ


한문제 푸는데 삽질과 삽질을 하면서 몇시간씩 지나갑니다.


46번 힌트를 얻으러 오신분께는 아래 힌트를 눌러주세요















Write up

// 12.11.04

// webhacking.kr problem. 46







전형적인 sql injection 입니다.


제출을 눌러보면 레벨이 1인 koang님의 정보가 나오고 머니는 137989이 나옵니다.


2를 눌러보면 zzibong 님의 결과가 나오고 무려 10,000,000 천만 이라는 엄청난 숫자가 눈에 띕니다.




그러나 3을 눌러보면 아무것도 없습니다.


자 이제 index.phps 를 분석해봅시다.



<?

if(time()<1256900400) exit();

?>
<!-- index.phps -->
<?

$_GET
[lv]=str_replace(" ","",$_GET[lv]);
$_GET[lv]=str_replace("/","",$_GET[lv]);
$_GET[lv]=str_replace("*","",$_GET[lv]);
$_GET[lv]=str_replace("%","",$_GET[lv]); // 문자열 제거 루틴

if(
eregi("union",$_GET[lv])) exit();
if(
eregi("select",$_GET[lv])) exit();
if(
eregi("from",$_GET[lv])) exit();
if(
eregi("challenge",$_GET[lv])) exit();
if(
eregi("0x",$_GET[lv])) exit();
if(
eregi("limit",$_GET[lv])) exit();
if(
eregi("cash",$_GET[lv])) exit(); // 문자열 확인시 실행중지

$q=@mysql_fetch_array(mysql_query("select id,cash from zmail_member where lv=$_GET[lv]"));

if(
$q && $_GET[lv]) // 쿼리가 성립시
{
echo(
"$q[0] information<br><br>money : $q[1]");

if(
$q[0]=="admin") @solve(); // 아이디가 admin이라면 solve

}
?>


간단한 소스입니다.


마지막에서 4번째줄을 보면 최종 목표는 아이디를 admin으로 만들어야 합니다.


제가 며칠전에 쓴 [번호는 기억이..] write up과 매우 유사한 문제입니다.


이제 공격 구문을 생각을 해보면


공백은 무효처리가 되므로 %20은 코드에 넣을수 없습니다.


하지만 공백 우회로 %0a가 가능합니다 [%가 필터링 되지만 주소창에 직접 넣으면 넘어갈때 줄바꿈으로 넘어가서 관계업습니다.]


그리고 = 은 따로 필터링 하지 않으니 그냥 사용할것이고 지난번 write up에 사용되었던 concat() 과 char() 을 사용하겠습니다.


Quary


3 or id=concat(char(a),char(d),char(m),char(i),char(n)) [char() 안의 알파벳은 아스키코드로 변환되어야 합니다.]


결과.



이번 편에서는 지난번에 풀었던 문제와 비슷해서 간략하게 진행되었습니다.

'0x10 정보보안 > 0x16 Web' 카테고리의 다른 글

Webhacking.kr 55번 중간 풀이.  (10) 2012.11.05
webhacking.kr 49번 write up  (5) 2012.11.05
Webhacking.kr 46번 write up  (2) 2012.11.04
Webhacking.kr 37번 Write up  (2) 2012.11.04
webhacking.kr 45번 write up  (2) 2012.11.02
webhacking.kr Challenge 22 Write up.  (3) 2012.11.01

Comment 2

  • 2013.05.08 23:02 수정 답글

    비밀댓글입니다

    • 2013.05.10 20:37 신고 수정

      1. admin으로 직접 되지 않아 따로 concat을 사용했습니다.
      만약 admin이 먹힌다면 그대로 사용해도 됩니다.

      2. %0a 같은 경우 hex로 0a 값은 줄바꿈이라는 것인데, 공격을할때 %0a를 넣으면 실제론 DB서버에선 줄바꿈으로 인식한다는 뜻입니다.