본문 바로가기

워게임

(18)
los rubiya - 31(zombie) 안녕하세요 이번엔 31단계인 좀비 문제를 풀어 보겠습니다. 보니 이번에 걸러지는 게 rollup 이랑 join이랑 ace 와 @와 i을 못 쓰네요. 제가 모르는 함수가 있어서 한 번 보고 가보겠습니다. -rollup ? GROUP BY 절에 종종 쓰이는 구문 입니다. 예시로 이런 테이블이 있다고 가정을 하겠습니다. Sales (Table) -------------- Region | Product | SalesAmount --------------------------------------- East | Product A | 100 East | Product B | 150 West | Product A | 200 West | Product B | 120 그 다음에 저희가 총합을 SUM 함수 이용해서 볼 때..
los rubiya - 30(ouroboros) 진짜 어려웠습니다. 제가 알고 있는 지식이 하나도 안 통해서 거의 일주일 동안 해매다가 결국 인터넷에 찾아 봤습니다. 시작하겠습니다. 그냥 pw을 찾으면 되는데.. admin의 것인지 누구 것의 pw을 찾으라는지 모르고 또한 정해진 pw을 찾으면 된다는데.. 어렵습니다. 일단 그냥 뭐든 넘어갈 수 있게 OR 구문을 이용해봤습니다. pw=1' OR 1=1 %23 또 union으로 간단하게 작성을 해봤습니다. pw하나의 컬럼만 들고오니깐 하나만 작성하면 되는 거죠. 이게 다 입니다. 계속 여기서 머물다가 결국 Quine SQL injection 이라는 새로운 지식을 찾았습니다. Quine은 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다고 해요. 그러니깐 입력 값을 그대로 결과 값으로 반환하는 SQL..
los rubiya - 29(phantom) 풀이 시작하겠습니다. 보아하니 no=1인 email 의 값을 찾으면 된다는데 음.. joinemail에 값을 입력을 하면 insert문으로 대입이 된다고 하네요 한번 넣어 보겠습니다. ?joinmail=1 대충 넣어볼게요 이렇게 들어간 걸 보여주네요! 그럼 insert을 할 때 no=1인 이메일을 넣도록 해보겠습니다. ?joinmail=1'), (0,'[자신ip주소]',(select email from prob_phantom user where no=1))# 1 넣고 뒤에 또 새로운 value 값도 넣게 한겁니다. 생각보다 쉬웠습니다. ?email=admin_secure_email@rubiya.kr
los rubiya - frankenstein(28번 문제) 시작하겠습니다. prob _ . union () 을 사용 못하네요 그리고 admin의 비밀번호을 알아내야 합니다. 또 문법이 이상해지면 error이 출력되네요! 이걸로 참 거짓을 판별하면 되겠네요! () 을 못쓰니 함수를 못 사용하겠네요 그럼 case when then 구절을 이용하겠습니다. 문법은 여기서 참고했습니다. https://velog.io/@0829kuj/SQL-CASE-%EB%AC%B8-CASE-WHEN-THEN [SQL] CASE 문 (CASE WHEN THEN) `sql`에서 여러조건 중 해당하는 조건의 값을 반환하는 문법. `if문`과 `swicth문` 처럼 조건에 해당하는 값을 반환하는 문법임. 모든 조건이 충족하지 않았을때 반환할 `else`절의 값을 지정해두지 않 velog.io ..
los rubiya - 27(blue dragon) 풀이 시작하겠습니다. 2번 필터링을 하네요. \ 랑 ' 의 사용을 막았습니다. 한 번 id에 ' 이랑 \을 줘보겠습니다. 이 말은 먼저 필터링을 할 때 \ 이랑 ' 은 안 한다는 이야기입니다. 그리고 쿼리문을 실행한 뒤에 ' 이나 \이 들어갔는지 확인을 하고 필터링을 하는 거죠. 그럼 저는 Time Based SQL Injection을 이용하겠습니다! 쿼리문은 실행이 된다는 이야기잖아요? 그러니깐 만약 참이면 1초 뒤에 나오게 해서 참인지 아닌지 분별하겠습니다. 공격 쿼리문은 ' and id='admin' and if(ascii(substr(pw,{},1))>{},sleep(1),0)# 이렇습니다. pw 한 자리을 꺼내와서 만약 참이면 1초 뒤에 나오고 아니면 0으로 거짓으로 판별하게 했습니다. 저는 보기 전..
los rubiya - 26(red_dragon) 풀이 시작하겠습니다. 보니 no는 숫자 값이네요! 만약 아니면 1로 강제 치환이 되게 해놨네요. id는 7자리이하이구요. 저희가 알아야되는건 no의 값을 알아야만 하네요 음.. 일단 7자리는 안되게 ' or 1# 해보겠습니다. 그럼.. '||no>%23&no=%0a1 해볼게요 %23은 #이여서 한 줄만 주석 처리를 합니다. 그리고 no에 %0a는 한 줄 띄어쓰기해서 #을 피해서 1을 입력하게 합니다. 그러면? 즉 저 sql문에 주석 처리된 것을 없애서 보면 select id from prob_red_dragon where id=''||no> 1 이렇게 됩니다! 그러니 no는 당연히 1보다 크니 참이여서 admin이 나오겠죠! 그럼 이제 찾으면 되겠죠 no의 길이 값은 모릅니다. 왜냐 id의 길이가 한정되어 있..
los rubiya - 25(green_dragon) 풀이 시작하겠습니다. id와 pw에 _ . ' " 을 막아 놨네요 그리고 admin이 출력이 되게 하라네요! 그럼 id에 \' and pw= 가 들어가게 되어서 '을 우회가 가능합니다. 그럼 저희는 이제 admin을 찾으면 되는데 저는 char 구문을 이용해서 admin 문자열을 출력하겠습니다, ?id=\&pw= OR id=CHAR(97,100,109,105,110) %23 아마 char을 못쓰게 했었을 수도 있습니다. 그럼 약간 우회를 더 해보죠. 어차피 if($result['id'] == "admin") solve("green_dragon"); 이 구문을 보시면 id 컬럼에 admin이 나오기만 하면 되잖아요? union 구문을 이용하겠습니다. 일단 잘 통하는지 확인만 해보겠습니다. ?id=\&pw= un..
los rubiya - 24(evil_wizard) 풀이 시작하겠습니다. 전 문제랑 같은데 중간에 same with hell_fire? really? 하네요 전 문제랑 같아 보이냐고 저한테 물어보네요! 한 번 똑같이 해보겠습니다. ?order=if(id='admin' AND length(email)=0,1,100) limit 0,1 ?order=if(id='admin' AND length(email)>0,1,100) limit 0,1 음..? 제 눈에는 같아 보이네요 한 번 제가 전에 짯던 (23번 hell_fire에 썻던) 코드를 그대로 가져오고 url만 수정하고 길이 값도 구하지 않고 그냥 충분히 주겠습니다. import requests import urllib.parse #******parameter:[파라미터이름],parameter value: [파라미..