SQLMap - CheatSheet
์ทจ์ฝ์ ํ๊ฐ ๋ฐ ์นจํฌ ํ ์คํธ๋ฅผ ์ํ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ . 20๊ฐ ์ด์์ ๋๊ตฌ ๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด๋์๋ ์ ์ฒด ์นจํฌ ํ ์คํธ๋ฅผ ์คํํ์ธ์. ์ฐ๋ฆฌ๋ ์นจํฌ ํ ์คํฐ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค - ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ด ๋ ๊น์ด ํ๊ณ ๋ค๊ณ , ์์ ํฐ๋จ๋ฆฌ๊ณ , ์ฌ๋ฏธ๋ฅผ ๋๋ ์ ์๋๋ก ๋ง์ถคํ ๋๊ตฌ, ํ์ง ๋ฐ ์ ์ฉ ๋ชจ๋์ ๊ฐ๋ฐํฉ๋๋ค.
SQLmap์ ์ํ ๊ธฐ๋ณธ ์ธ์
์ผ๋ฐ
์ ๋ณด ๊ฒ์
๋ด๋ถ
DB ๋ฐ์ดํฐ
Injection place
From Burp/ZAP capture
์์ฒญ์ ์บก์ฒํ๊ณ req.txt ํ์ผ์ ์์ฑํฉ๋๋ค.
GET ์์ฒญ ์ฃผ์
POST ์์ฒญ ์ฃผ์
ํค๋ ๋ฐ ๊ธฐํ HTTP ๋ฉ์๋์์์ ์ธ์ ์
์ธ์ ์
์ด ์ฑ๊ณตํ์ ๋ ๋ฌธ์์ด ํ์
Eval
Sqlmap๋ -e
๋๋ --eval
์ ์ฌ์ฉํ์ฌ ๊ฐ ํ์ด๋ก๋๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์ผ๋ถ ํ์ด์ฌ ์๋ผ์ด๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ด๋ก๋๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์ฌ์ฉ์ ์ ์ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ค์ ์์ ์์ flask ์ฟ ํค ์ธ์
์ ์ ์กํ๊ธฐ ์ ์ ์๋ ค์ง ๋น๋ฐ๋ก flask์ ์ํด ์๋ช
๋ฉ๋๋ค:
์
ธ
ํ์ผ ์ฝ๊ธฐ
SQLmap์ผ๋ก ์น์ฌ์ดํธ ํฌ๋กค๋ง ๋ฐ ์๋ ์ต์คํ๋ก์
๋ ๋ฒ์งธ ์ฐจ์ ์ฃผ์
์ด ๊ฒ์๋ฌผ์ ์ฝ์ด๋ณด์ธ์ sqlmap์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ณ ๋ณต์กํ 2์ฐจ ์ฃผ์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ด์ฉ์ ๋๋ค.
์ฃผ์
์ฌ์ฉ์ ์ ์
์ ๋ฏธ์ฌ ์ค์
์ ๋์ฌ
๋ถ๋ฆฌ์ธ ์ธ์ ์
์ฐพ๊ธฐ ๋์๋ง
Tamper
๊ธฐ์ตํ์ธ์, ๋น์ ์ ํ์ด์ฌ์ผ๋ก ์์ ์ tamper๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ ๋ฒ์งธ ์์ ์ฃผ์ ํ์ด์ง์์ tamper ์์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
Tamper | Description |
---|---|
apostrophemask.py | ์ํฌ์คํธ๋กํ ๋ฌธ์๋ฅผ UTF-8 ์ ์ฒด ํญ ๋์ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
apostrophenullencode.py | ์ํฌ์คํธ๋กํ ๋ฌธ์๋ฅผ ๋ถ๋ฒ์ ์ธ ์ด์ค ์ ๋์ฝ๋ ๋์ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
appendnullbyte.py | ํ์ด๋ก๋ ๋์ ์ธ์ฝ๋ฉ๋ NULL ๋ฐ์ดํธ ๋ฌธ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
base64encode.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํฉ๋๋ค. |
between.py | '>' ์ฐ์ฐ์๋ฅผ 'NOT BETWEEN 0 AND #'๋ก ๊ต์ฒดํฉ๋๋ค. |
bluecoat.py | SQL ๋ฌธ ๋ค์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ ํจํ ๋ฌด์์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. ์ดํ '=' ๋ฌธ์๋ฅผ LIKE ์ฐ์ฐ์๋ก ๊ต์ฒดํฉ๋๋ค. |
chardoubleencode.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ด์ค URL ์ธ์ฝ๋ฉํฉ๋๋ค (์ด๋ฏธ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์). |
commalesslimit.py | 'LIMIT M, N'๊ณผ ๊ฐ์ ์ธ์คํด์ค๋ฅผ 'LIMIT N OFFSET M'์ผ๋ก ๊ต์ฒดํฉ๋๋ค. |
commalessmid.py | 'MID(A, B, C)'์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ 'MID(A FROM B FOR C)'๋ก ๊ต์ฒดํฉ๋๋ค. |
concat2concatws.py | 'CONCAT(A, B)'์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'๋ก ๊ต์ฒดํฉ๋๋ค. |
charencode.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ URL ์ธ์ฝ๋ฉํฉ๋๋ค (์ด๋ฏธ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์). |
charunicodeencode.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋น์ธ์ฝ๋ฉ ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ URL ์ธ์ฝ๋ฉํฉ๋๋ค (์ด๋ฏธ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์). "%u0022" |
charunicodeescape.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋น์ธ์ฝ๋ฉ ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ URL ์ธ์ฝ๋ฉํฉ๋๋ค (์ด๋ฏธ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์). "\u0022" |
equaltolike.py | '=' ์ฐ์ฐ์์ ๋ชจ๋ ๋ฐ์์ 'LIKE' ์ฐ์ฐ์๋ก ๊ต์ฒดํฉ๋๋ค. |
escapequotes.py | ์ฌ๋์๋ก ์ธ์ฉ๋ถํธ ('์ ")๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. |
greatest.py | '>' ์ฐ์ฐ์๋ฅผ 'GREATEST' ๋์ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
halfversionedmorekeywords.py | ๊ฐ ํค์๋ ์์ ๋ฒ์ ์ด ์๋ MySQL ์ฃผ์์ ์ถ๊ฐํฉ๋๋ค. |
ifnull2ifisnull.py | 'IFNULL(A, B)'์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ 'IF(ISNULL(A), B, A)'๋ก ๊ต์ฒดํฉ๋๋ค. |
modsecurityversioned.py | ์ ์ฒด ์ฟผ๋ฆฌ๋ฅผ ๋ฒ์ ์ด ์๋ ์ฃผ์์ผ๋ก ๊ฐ์๋๋ค. |
modsecurityzeroversioned.py | ์ ์ฒด ์ฟผ๋ฆฌ๋ฅผ ์ ๋ก ๋ฒ์ ์ฃผ์์ผ๋ก ๊ฐ์๋๋ค. |
multiplespaces.py | SQL ํค์๋ ์ฃผ์์ ์ฌ๋ฌ ๊ฐ์ ๊ณต๋ฐฑ์ ์ถ๊ฐํฉ๋๋ค. |
nonrecursivereplacement.py | ๋ฏธ๋ฆฌ ์ ์๋ SQL ํค์๋๋ฅผ ๊ต์ฒด์ ์ ํฉํ ํํ์ผ๋ก ๊ต์ฒดํฉ๋๋ค (์: .replace("SELECT", "") ํํฐ). |
percentage.py | ๊ฐ ๋ฌธ์ ์์ ๋ฐฑ๋ถ์จ ๊ธฐํธ ('%')๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
overlongutf8.py | ์ฃผ์ด์ง ํ์ด๋ก๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ณํํฉ๋๋ค (์ด๋ฏธ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์). |
randomcase.py | ๊ฐ ํค์๋ ๋ฌธ์๋ฅผ ๋ฌด์์ ๋์๋ฌธ์ ๊ฐ์ผ๋ก ๊ต์ฒดํฉ๋๋ค. |
randomcomments.py | SQL ํค์๋์ ๋ฌด์์ ์ฃผ์์ ์ถ๊ฐํฉ๋๋ค. |
securesphere.py | ํน๋ณํ ์ ์๋ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค. |
sp_password.py | ํ์ด๋ก๋ ๋์ 'sp_password'๋ฅผ ์ถ๊ฐํ์ฌ DBMS ๋ก๊ทธ์์ ์๋์ผ๋ก ๋๋ ํํฉ๋๋ค. |
space2comment.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ์ฃผ์์ผ๋ก ๊ต์ฒดํฉ๋๋ค. |
space2dash.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ๋์ ์ฃผ์ ('--')์ผ๋ก ๊ต์ฒดํ๊ณ ๋ฌด์์ ๋ฌธ์์ด๊ณผ ์ ์ค ('\n')์ ์ถ๊ฐํฉ๋๋ค. |
space2hash.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ํ์ด๋ ๋ฌธ์ ('#')๋ก ๊ต์ฒดํ๊ณ ๋ฌด์์ ๋ฌธ์์ด๊ณผ ์ ์ค ('\n')์ ์ถ๊ฐํฉ๋๋ค. |
space2morehash.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ํ์ด๋ ๋ฌธ์ ('#')๋ก ๊ต์ฒดํ๊ณ ๋ฌด์์ ๋ฌธ์์ด๊ณผ ์ ์ค ('\n')์ ์ถ๊ฐํฉ๋๋ค. |
space2mssqlblank.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ์ ํจํ ๋์ฒด ๋ฌธ์ ์งํฉ์์ ๋ฌด์์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
space2mssqlhash.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ํ์ด๋ ๋ฌธ์ ('#')๋ก ๊ต์ฒดํ๊ณ ์ ์ค ('\n')์ ์ถ๊ฐํฉ๋๋ค. |
space2mysqlblank.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ์ ํจํ ๋์ฒด ๋ฌธ์ ์งํฉ์์ ๋ฌด์์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
space2mysqldash.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ๋์ ์ฃผ์ ('--')์ผ๋ก ๊ต์ฒดํ๊ณ ์ ์ค ('\n')์ ์ถ๊ฐํฉ๋๋ค. |
space2plus.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ๋ํ๊ธฐ ๊ธฐํธ ('+')๋ก ๊ต์ฒดํฉ๋๋ค. |
space2randomblank.py | ๊ณต๋ฐฑ ๋ฌธ์ (' ')๋ฅผ ์ ํจํ ๋์ฒด ๋ฌธ์ ์งํฉ์์ ๋ฌด์์ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ต์ฒดํฉ๋๋ค. |
symboliclogical.py | AND ๋ฐ OR ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ๊ทธ๋ค์ ๊ธฐํธ ๋์ ๋ฌธ์ (&& ๋ฐ |
unionalltounion.py | UNION ALL SELECT๋ฅผ UNION SELECT๋ก ๊ต์ฒดํฉ๋๋ค. |
unmagicquotes.py | ์ธ์ฉ ๋ฌธ์ (')๋ฅผ ๋ค์ค ๋ฐ์ดํธ ์กฐํฉ %bf%27๋ก ๊ต์ฒดํ๊ณ ๋์ ์ผ๋ฐ ์ฃผ์์ ์ถ๊ฐํฉ๋๋ค (์๋ํ๊ฒ ํ๊ธฐ ์ํด). |
uppercase.py | ๊ฐ ํค์๋ ๋ฌธ์๋ฅผ ๋๋ฌธ์ ๊ฐ 'INSERT'๋ก ๊ต์ฒดํฉ๋๋ค. |
varnish.py | HTTP ํค๋ 'X-originating-IP'๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
versionedkeywords.py | ๊ฐ ๋นํจ์ ํค์๋๋ฅผ ๋ฒ์ ์ด ์๋ MySQL ์ฃผ์์ผ๋ก ๊ฐ์๋๋ค. |
versionedmorekeywords.py | ๊ฐ ํค์๋๋ฅผ ๋ฒ์ ์ด ์๋ MySQL ์ฃผ์์ผ๋ก ๊ฐ์๋๋ค. |
xforwardedfor.py | ๊ฐ์ง HTTP ํค๋ 'X-Forwarded-For'๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
์ทจ์ฝ์ ํ๊ฐ ๋ฐ ์นจํฌ ํ ์คํธ๋ฅผ ์ํ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ . 20๊ฐ ์ด์์ ๋๊ตฌ ๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด๋์๋ ์ ์ฒด ์นจํฌ ํ ์คํธ๋ฅผ ์คํํ์ธ์. ์ฐ๋ฆฌ๋ ์นจํฌ ํ ์คํฐ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค - ๊ทธ๋ค์๊ฒ ๋ ๊น์ด ํ๊ณ ๋ค๊ณ , ์ ธ์ ํฐ๋จ๋ฆฌ๊ณ , ์ฌ๋ฏธ๋ฅผ ๋๋ ์ ์๋๋ก ๋ง์ถคํ ๋๊ตฌ, ํ์ง ๋ฐ ์ ์ฉ ๋ชจ๋์ ๊ฐ๋ฐํฉ๋๋ค.
Last updated