1번
<?php
include "../../config.php";
if($_GET['view-source'] == 1){ view_source(); }
if(!$_COOKIE['user_lv']){
SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?php
if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
if($_COOKIE['user_lv']>5) solve(1);
echo "<br>level : {$_COOKIE['user_lv']}";
?>
<br>
<a href=./?view-source=1>view-source</a>
</body>
</html>
단순한 php 문제이다. user_lv 이란 쿠키값이 중요하게 작용한다. 코드를 보면 알겠지만 user_lv 쿠키값을 5~6사이값으로 설정하면 쉽게 풀린다. is_numeric 함수는 값이 숫자인지만을 검사하는 함수이기 때문에 소수도 true를 반환한다.
3번
일단 노노그램이라고 써져 있어서 풀었다. 푸는 법을 몰랐는데 그냥 인터넷에 치니 나왔고, 어렵지 않게 풀 수 있었다.
클리어를 하면 위 사진과 같은 창이 나온다.
hidden 으로 숨겨진 태그가 있기에 저 value를 한글로 바꾸고 submit을 하니 query error 라는 창이 떴고 sql 쪽이라는 것을 알았다.
따라서 쌍따옴표를 통해서 쿼리를 보내봤는데 아주 잘들어갔다. 아마도 쌍따옴표가 아닌 일반 따옴표로 query문이 구성된 것 같았다.
' or 1=1 # 을 value에 넣어서 보내주었더니 풀렸다.
4번
<?php
include "../../config.php";
if($_GET['view-source'] == 1) view_source();
?><html>
<head>
<title>Challenge 4</title>
<style type="text/css">
body { background:black; color:white; font-size:9pt; }
table { color:white; font-size:10pt; }
</style>
</head>
<body><br><br>
<center>
<?php
sleep(1); // anti brute force
if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
$hash = rand(10000000,99999999)."salt_for_you";
$_SESSION['chall4'] = $hash;
for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
</table>
</form>
<a href=?view-source=1>[view-source]</a>
</center>
</body>
</html>
key 값이 처음 만들어진 rand+salt 값과 동일하면 문제가 풀린다. 아무래도 brute forcing을 하면 세션이 만료될 것 같았다. ... 여기서 멘붕이 와서 구글에서 살짝 힌트를 얻었다. 레인보우 테이블을 만들어주라고 한다.
나는 스레드를 쉽게 쓰고 싶어서 c#으로 만들어주었다.
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;
namespace rainbow
{
class Program
{
public static int count = 0;
public static String[] table = new string[90000000];
public static string ByteToHex(byte[] bytes)
{
string hex = BitConverter.ToString(bytes);
return hex.Replace("-", "").ToLower();
}
static void makeHash(int num)
{
SHA1 sha = new SHA1CryptoServiceProvider();
String key = num.ToString()+"salt_for_you";
String result = key;
for (int i = 0; i < 500; i++)
{
byte[] data = sha.ComputeHash(System.Text.Encoding.ASCII.GetBytes(result));
result = ByteToHex(data);
}
table[num-10000000] = result;
}
static void Main(string[] args)
{
Parallel.For(10000000, 100000000, (i) =>
{
makeHash(i);
});
StreamWriter sw = new StreamWriter("rainbow.csv");
System.Console.WriteLine("Writing");
for (int i = 10000000; i < 100000000; i++)
sw.WriteLine(table[i- 10000000]);
sw.Close();
}
}
}
결과적으로 테이블이 성공적으로 만들어졌고 풀 수 있었다. 내 c# 코드를 쓰고 싶은 분들은 저기서 table 배열을 byte 타입으로 바꾸고 result를 byte형식으로 변환해서 기록하고 csv에 적을 때에도 반대로 해주는 것이 램을 2배 아낄 수 있을 것이다. 내 프로그램은 10기가는 쓰는듯 하다. 그리고 저렇게 대용량 csv는 엑셀에서 안열린다.
31번
랜덤으로 10000~10100 사이의 수로 원하는 ip의 port로 접근 할 수 있다. 커넥션이 연결되면 flag를 전송해준다.
fsockopen 함수는 php에서 제공하는 소켓 함수이다. 일반 소켓함수와 비슷하게 작동하는데 호스트에 도메인등을 적어줄 수 있고 비동기 처리 기능이 강화되었다.
따라서 자신의 서버에서 그냥 포트 열고 랜덤넘버가 맞을 때까지 계속 돌리면 되는데... 일단 주의 해줄 것이 있었다.
원래라면 내 노트북에서 연결했겠지만, 지금 wifi 상태여서 포트포워딩 설정하기는 너무 귀찮았고.. gcp 서버로 연결해주었는데..
1. 서버측에서는 자신의 내부 ip로 열어야 된다.
2. 방화벽에 설정을 허용해주거나, 그냥 끄고 하는게 속편하다.
<?php
set_time_limit (0);
$address = "10.178.0.2";
$port = 10027;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Could not bind to address');
socket_listen($sock);
$client = socket_accept($sock);
$input = socket_read($client, 1024);
echo $input;
?>
위는 내 서버측 코드이다. address를 자신의 내부 ip주소로 바꾸어 사용하거나, 랜선 꼽고 돌리는게 편할지도
연결이 되면 이렇게 flag가 전송된다.
38번
이런 페이지로 접속이 된다. 그리고 admin.php 라는곳을 확인할 수 있는데(소스코드에서 주석 힌트)
로그인을 admin으로 하려고 하면 you are not admin 이라는 문구가 뜬다.
이렇게 로그인을 시도한 기록이 남는다. 여기에 admin으로 로그인한 로그를 남겨주면 되는 것 같다.
이런 시도를 해보았는데, 줄바꿈을 하면 어떨까 해서 input을 textarea로 바꾸고 다시 시도해주었더니 풀렸다. 뭐지?
'전공쪽 > 동아리 관련' 카테고리의 다른 글
DiceCTF Babier CSP, MissingFlavortext (0) | 2021.02.09 |
---|---|
webhacking.kr 26,54,27,36,28 (0) | 2021.02.02 |
webhacking.kr (0) | 2021.01.27 |
sfctf winter write up (0) | 2021.01.26 |
sfw8 write up (0) | 2021.01.11 |