일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- 신경망
- 파이썬신경망
- 알고리즘
- 백준알고리즘
- 인공지능
- 머신러닝
- BOF
- 버퍼오버플로우
- FTZlevel10
- C알고리즘
- 신경망파이썬
- 스트림암호
- 활성화함수파이썬
- 항등함수
- 정보보안
- 신경망구현
- 8086CPU레지스터
- 파이썬
- c언어
- 보안
- 신경망 학습
- 밑바닥부터시작하는딥러닝
- 소프트맥스함수
- C언어 알고리즘
- 달고나bof
- 백준
- 딥러닝
- 딥러닝파이썬
- BOJ
- C언어알고리즘
- Today
- Total
HeeJ's
Webhacking.kr old-18 본문
문제 화면이다.
SQL Injection을 이용해서 해결하는 문제라는 것을 알 수 있으며, 소스코드를 확인해주었다.
위 문제의 소스코드인데, php부분을 보고 코드를 조금 읽어보았다.
if($_GET['no']){
$db = dbconnect(); //get 방식으로 'no'를 입력받고, 파일과 DB를 연결한다.
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
//get 방식으로 받은 no를 검사하는데, 위의 문자(공백, /, &, select, from 등)가 포함되어있으면 no hack을 출력하고 종료한다.
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]"));
//chall18 테이블에서 id가 guest이고 입력받은 no가 입력받은 id를 result에 저장한다.
if($result['id']=="guest") echo "hi guest"; //id가 guest이면 hi guest 출력
if($result['id']=="admin"){ //id가 admin이면
solve(18); //문제를 해결하는 함수인 것 같다.
echo "hi admin!"; //hi admin을 출력한다.
}
위의 코드의 주석에서 admin no는 2라는 것을 알려준다.
그렇기 때문에 no가 2고 id가 admin인 result를 추출하면 되는 것 같다.
하지만 result에서 id가 guest라는 조건이 있기 때문에 연산자 우선 순위를 이용해 줄 것이다.
연산자에서는 and 연산을 한 후 or 연산이 실행되기 때문에
TRUE and FALSE or TRUE 는 TRUE를 출력하게 되는 것이다.
TRUE and FALSE or TRUE
= FALSE or TRUE = TRUE
그러므로, where id='guest' and no=0 or no=2 를 입력해주게 되면, (FALSE 구문에 숫자는 아무거나 넣어주어도 된다)
and 조건이 FALSE가 되고, or 뒤가 TRUE가 되니 no=2의 값을 검색해주게 된다.
그래서 url 뒤에 ?no=0 or no=2를 입력해주면 문제가 해결되는데,
위의 필터링 구문에서 공백문자 또한 필터링 대상이었기 때문에 공백 대신에 %09를 사용해
?no=0%09or%09no=2를 입력해주면
문제 해결
'<CTF> > <Webhacking.kr>' 카테고리의 다른 글
Webhacking.kr old-01 (0) | 2020.10.30 |
---|---|
Webhacking.kr old-27 (0) | 2020.10.12 |
Webhacking.kr old-34 (0) | 2020.10.01 |
Webhacking.kr old-32 (0) | 2020.09.25 |
Webhacking.kr old-26 (0) | 2020.09.24 |