2022. 4. 13. 15:36ㆍSite/LOS
이번에는 xavis를 풀어보겠습니다
이번 xavis문제는 힌트를 참고했습니다[역대급으로 까다로운 문제여서 힌트없이는 힘들었습니다ㅠ]
소스코드를 보겠습니다.
prob _ . ( )
regex like 을 필터링 해줍니다 cf) regex = 특정한 규칙으로 문자열을 찾아내줌
addslashes함수로 $_GET['pw'] 필터링
$result['pw']와 $_GET['pw']가 정확히 일치해야 클리어되는 blind sql injection 문제인 것 같습니다
기존의 blind sql injection 문제풀이럼 접근하면 되는 줄 알았습니다
당연히 pw의 길이를 구하고 길이가 8이라 예측했지만 아니었습니다...
힌트를 찾아보니 UNION 을 활용해서 푸는 방법이 있었습니다.
SQL에서 UNION은 두 개 이상의 SQL 쿼리문을 합치는 방법이고 여러개에 쿼리문을 사용하여 하나에 데이터로 출력해야되는 경우 자주 사용이 된다고 합니다. [각 쿼리의 결과 합을 반환하는 합집합 (중복제거)]
접근방법
select @지역변수이름:=값 -> 변수에 값을 할당하는 코드
cf) select @지역변수이름=값을 해주면 select에서 =을 비교연산자로 인식함.
만약 select @local_name:="1234" 라고 해준다면 지역변수이름을 local_name이라 해주고 값에 "1234"를 넣어준다는 의미입니다.
(SELECT @pwname:=pw WHERE id='admin') 이라고 설정을 해준다면
pwname에 admin의 pw의 값을 넣어준다는 의미입니다.
하지만 @pwname에 admin의 pw값을 리턴을 해주어야 값을 알아낼텐데 위처럼하면 아무것도 리턴을 안해준다고 합니다.
여기서 리턴을 해주기 위해 UNION을 사용하여 지역변수값을 select해주면 됩니다.
최종 쿼리문 -> or (select @pwname:=pw where id='admin') union select @pwname#'
admin의 pw값이 우왕굳이라고 나옵니다[한글?]
cf) 여기서 상세한 설명을 잘해놓으신 것 같아서 참고하면 좋을것 같습니다
-> https://hackingisly.tistory.com/33
복습 좀 빡세게 해야 될 것 같습니다