รู้สึกว่าผมจะทำ xss บน soccersuck ได้อีกละแฮะ ปรับพวกฟันหนูนิดหน่อย
คือสถานการณ์ตอนนี้คือ <> ถูก block ไม่ให้ใช้เวลา comment (กลายเป็น < >)
แต่ bbcode [img] ยังสามารถใช้ได้ผมทำ xss จากตรงนี้ครับ โดยอะไรก็ตามที่อยู่ระหว่าง
[img]http://path-to-image[/img] จะกลายเป็น <img src=”http://path-to-image”>
ดังนั้นถ้าเราใส่ค่า ระหว่า bbcode เป็น [img]http://path-to-image” onload=alert(‘xss’);//[/img]
กลายเป็นว่าผมสามารถแทรก javascript ลงไปได้ โดยจะทำงานตามเงื่อนไขทีผมกำหนด เช่น
onload onmouserover etc ทีนี้แล้วจะสั่งให้กดแผล่บโดยผ่าน dom ครับ โดยใช้
onmouserover=document.getElementsByClassName(‘addpoint_button’)[0].click();
คือเมื่อไหร่ที่มีคนเอา Mouse pointer ไปวางบนภาพให้กดแผล่บอันแรกบนหน้านั้น ๆ
จริง ๆ ผมเคยคาดการณ์ไว้แล้วว่าถ้าสามารถแทรก javascript ได้จะสามารถ
– หลอกเก็บ cookies หรือ บังคับกดแผล่บได้ แต่พอลองทำ windows.location เพื่อเอา cookies
ดันไม่เวิร์คแฮะ เพราะ URL เป็น tag <a href โดยอัตโนมัติ และผมยังหาวิธีแก้ไม่ได้
รู้สึกจะมีคนเอาไป improvise เป็น src=x onerror=document.getElementsByClassName(‘addpoint_button’)[0].click();
ก่อนที่ผมจะโดนแบนนะ แบบนี้ได้แผล่บแน่ ๆ หละครับ
คือ แบบนี้ครับที่ทำงานผมมีระบบสารสนเทศ 2 ระบบ ให้ชื่อว่า ระบบA กับระบบB ละกันครับ
ตอนแรกสองระบบนี่ต่างคนต่างอยู่วิ่งบน vpn ของใครของมัน ทีนี้เกิดการควบรวมเครือข่ายสองระบบ
เข้าด้วยครับ แล้วมีความคิดว่า ถ้าใช้ระบบB ให้สามารถเข้าถึงระบบA ได้เลยไม่ต้อง log in สองครั้ง
ก็น่าจะดี (ทั้งสองระบบเป็น web application ครับ)
ทีนี้โจทย์คือ ระบบB ต้องไม่เก็บ username password ของระบบA ไว้ครับ
ซึ่งตรงนี้ผมไม่ได้เข้าไปมีส่วนร่วมในการออกแบบนะครับ
จนผมไปสังเกตเห็นว่าถ้าเข้าระบบA ผ่านระบบB จะมีการร้องขอ url ไปที่ระบบA
ดังนี้ครับ ค้นมาโดยใช้โปรแกรม นี้ ครับ
https://172.17.2.xx/systemA/systemAConfigManager?user=nlnvEBqG7o0%3D&pwd=3lZatbxCrQ8%3D&link=systemA/xxisa/prepareDAAP0100.do?programID=XXIP01&siteName=systemB
สังเกตใช่ไหมครับว่าส่งไปโดยใช้ get method ส่งค่าที่น่าจะเป็น hash ของ username กับ password
ซึ่งเมื่อลองเข้า url ข้างบนไปปรากฏว่าเข้าได้ครับ ไม่ต้อง log in
กลายเป็นว่าถ้าผมรู้ url ก็สามารถเข้าได้โดยไม่ต้องรู้ username และ password
ตรงนี้เห็นชัดเลยว่าออกแบบไม่ดีครับ เลี่ยงการส่ง username password ที่เป็น plain text ไปแต่ส่งค่า
hash ซึ่งเหมือนกันทุกครั้งก็ไม่มีประโยชน์ครับ เหมือนส่ง plain text ไป แล้วพอมารวมกับการใช้ get method
ทำให้สังเกตง่ายขึ้น และท้ายสุดเครื่องลง ccleaner ครับ แต่ไม่ได้ตั้งค่าให้ลบ history ออกทุกครั้ง
กลายเป็นว่าเกิดเป็นช่องโหว่ให้ใคร ๆ สามารถเข้าถึงระบบได้
(สังเกตพวก fb หรือเว็ปอื่น ๆ ครับเวลา login ไม่ใช้พวก get method หรอกครับ)
อ้อ ทั้งสองระบบนี่ลงทุนหลักร้อยล้านครับ เพราะฉะนั้นมันจำเป็นมาก ๆ ครับ ที่จะมีคนที่เข้าใจเรื่องความปลอดภัย
ร่วมออกแบบหรือ review การทำงานของทุก ๆ ส่วน
ปัญเอิญเมลที่ทำงานมีปัญหามีเมลตีกลับแบบนี้ครับ
This message was created automatically by mail delivery software.
A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:
This message was created automatically by mail delivery software.
A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:
xxx@gmail.com
Unrouteable address
Google เจอว่าไอ้ Unrouteable address นี่หลัก ๆ แล้วเกิดจากการที่ ส่งเมลเกินโควต้าที่ทำหนดใน server
ซึ่งผมลองส่งเมลโดยใช้ telnet ส่งเมลได้โดยไม่ต้อง authen ครับ สรุปคงมีคนแอบใช้ไปส่งเมลอื่น ๆ จนเกินโควต้าจนเกิด error ดังกล่าวขึ้นครับ
ซึ่งเราสามารถกำหนด เมลผู้ส่ง ผู้รับได้ตามใจ ถามว่าอันตรายมากไหมก็ไม่มากครับแต่อาจจะเอาไปประยุกต์ใช้
เกี่ยวกับพวก spam หรือ phishing ได้ วิธีแก้ก็ให้ทาง hosting config ให้ authen ก่อนส่งเมลทุกครั้งครับ
ส่วนใหญ่พวก web app เราจะใส่พวก captchar ด้วยในหน้า login หรือฟอร์มต่าง ๆ เพื่อกันบอทโพสข้อมูลหรือ login ซ้ำ ๆ จนได้ password ใช่ไหมครับ แต่เราเคยสงสัยไหมครับว่า captchar ของเรานี่ดีในระดับไหน
ผมขอเล่าวิธีการทดสอบง่าย ๆ โดยใช้ selemiun กับ tesseract ละกันครับ โดยขอบเขตของการทดสอบคือใช้กับ captchar ที่เป็นตัวอังกฤษภาษาอังกฤษผสมตัวเลขเท่านั้นครับ ภาษาที่ใช้เป็น python ครับ นี่เป็นหน้าตาของส่วน login ที่เราจะทดสอบนะครับ captchar เป็นตัวเลขล้วนครับ
ผมจะอธิบายโค้ดทีละบรรทัดนะครับ
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys, string, os, time
#ด้านบนเป็นการ import lib ทั้งหมดครับ
driver = webdriver.Firefox()
driver.get(“http://www.xxx.com/login”)
#เลือก driver ที่เราจะใช้ในการทดสอบตามโค้ดเป็น firefox เมื่อ run จะเปิด firefox ขึ้นมาครับ
assert “Login” in driver.title
#ดูว่า title ของ page มีคำว่า Login หรือไม่ครับ
driver.save_screenshot(‘screenshot.png’)
#ทำ ss ของหน้าเว็ป ตรงนี้สังเกตว่าต้องใช้ ss เพราะ captchar จะเปลี่ยนมี refresh ใหม่ทุกครั้งครับ
os.chdir(‘C:\Program Files\ImageMagick-6.9.0-Q16’)
os.system(‘”convert -crop 145×45+750+270 c:\screenshot.png c:\ss.png”‘)
os.chdir(‘C:\\’)
os.system(‘tesseract ss.png test -psm 7’)
#หลังจากที่ได้ ss แล้วเราก็ crop ภาพให้เหลือแต่ส่วนที่เป็น captchar ครับ แล้วใช้ tesseract ที่เป็น opensource orc แกะตัวอักษรออกมา -psm 7 คือให้อ่านออกมาเหมือนว่ามีบรรทัดเดียวครับ
f = open(‘C:\\test.txt’,’r’)
captchar = f.read()
output = ”
for char in captchar:
if ‘0’<= char <= ‘9’:
output=output+char
#หลังจากได้ captchar มาแล้วจะมีบางส่วนที่อ่านไม่ได้ครับแล้วออกมาเป็นตัวอักษรแปลก ๆ ครับ เราจะต้องกรองให้เหลือแค่ตัวเลขครับ
s = ‘ren ss.png ‘+output+”.png”
os.system(s)
#พอได้ตัวเลขแล้วก็เปลี่ยนชื่อไฟล์เพื่อเช็คว่า captchar ที่อ่านได้ถูกกี่เปอร์เซ็นต์ โค้ดตัวอย่างไม่ได้ทำ for loop นะครับ แต่ผมทดสอบไป 100 ครั้งได้ผลตามสรุปครับ
สรุปแล้วผลที่ผมได้คือ 63% อ่านได้ถูกต้องตัวเลขครบทั้งหกตัว 24% ตัวเลขครบหกตัวแต่จะอ่านตัวเลขผิดส่วนที่ผิดมาก ๆ จะเป็นอ่านเลขแปดเป็นเลขสามครับ อีก 13% อ่านตัวเลขได้ไม่ครบทั้งหกตัวครับ
ซึ่งถ้าเราปรัปเปลี่ยนให้อีก 13% ที่อ่านตัวเลขได้ไม่ครบกลับไป recursive อีกครั้งความเป็นไปได้ที่เราจะอ่าน captchar ได้อย่างถูกต้องจะอยู่ที่ 71% ครับ
จริง ๆ ผมไม่แน่ใจว่า captchar นี่ควรจะกันบอทได้อย่างน้อยกี่ % แต่เข้าใจว่าเกิน 60% ถือว่ามากเกินไปและควรจะเปลี่ยน อ้างอิงจาก recaptchar ของ google ที่มีคนแกะจนอ่านได้เกิน 60% แล้วเริ่ม implement มาใช้ภาพแทนครับ
–วิธีลง PhantomJS บน ubuntu https://gist.github.com/julionc/7476620
อีกปัญหาที่ผมพบบน ssballthai.in.th คือ เวลาตอบคอมเมนต์หรือตั้งกระทู้สามารถแทรก javascript ที่เป็น xss ได้ครับ ตอนนี้ยังมีปัญหาเหลืออยู่แต่จะอยู่ในการ preview ก่อนตอบหรือตั้งกระทู้ครับ
ตรงนี้ปัญหาเกิดจากการแทรกรูปที่ยอมให้แทรก tag img ได้ครับ โค้ดที่ผมใช้ก็คือ onload=”alert(‘xss’)” เวลาที่ภาพโหลดขึ้นมาตัว javascript ก็จะทำงานครับ
จริง ๆ ผมไม่ค่อยเก่งเรื่อง javascript เท่าไหร่แต่เข้าใจว่าอย่างน้อยปัญหานี้ ทำให้สามารถตั้งกระทู้ที่ทุกคนที่เข้ามาในกระทู้สามารถแผล่บให้เราโดยอัติโนมัติได้ หรือบังคับให้โพสหรือส่ง cookie ไปยัง server ที่ต้องการได้ครับ ซึ่งทำให้สามารถเอา cookies ของ admin มาเป็นของตัวเองได้ (ส่วนนี้ถ้ามีใครเข้าใจการทำงานของ cookie รบกวนเพิ่มเติมให้ด้วยครับ เพราะเข้าใจว่าในปัจจุบันการขโมย cookie อย่างเดียวใช้ไม่ได้แล้วเพราะจะ cross check กับ ip address)
วิธีการป้องกัน xss ก็คือใช้พวก framework ที่มี feature ป้องกัน xss หรือพวก html puifier กรองโค้ดที่เป็นอันตรายออกก่อน
อดีตเว็ป soccersuck ทำเว็ปใหม่มาได้ซักพักครับ มี feature ใหม่ คือ แผล่บ ซึ่งก็คล้าย ๆ กับ like บน facebook นี่แหละครับ ไอ้แผล่บที่ว่าสามารถเอาไปแลกไอเทม หรือเลื่อนยศผู้ใช้งานได้ครับ ทำให้ แผล่บ เป็นที่ต้องการ
เราสามารถกดปุ่มแผล่บเพื่อแผล่บ “ให้คนอื่น” ได้ครับ สามารถแผล่บได้เดือนละ 200 แผล่บต่อเดือน แน่นอนว่าแผล่บให้ตัวเองไม่ได้ครับไม่งั้นก็แผล่บให้ตัวเองรัว ๆ ได้ หน้าตามปุ่มแผล่บก็ไอ้หน้าเลีย ๆ นี่แหลครับ
ขั้นตอนการแผล่บก็ง่าย ๆ ครับ ถ้าใช้ firebug ดู จะเห็นว่าแต่ละคอมเมนต์มีค่า string กำกับแผล่บอยู่ ถ้าเรากดแผล่บก็จะส่งค่า string ดังกล่าวกลับไปที่ server ทีนี้การกดแผล่บให้ตัวเองก็ง่าย ๆ ครับ ใช้ firebug ดูค่า string แผล่บคอมเมต์เราแล้ว copy ค่าดังกล่าวไปใส่ที่ปุ่มแผล่บคนอื่น เท่านี้เราก็จะสามารถแผล่บให้ตัวเองได้แล้วครับ
ตามภาพ string ของแผล่บคือ Mjg0M….. นี่แหละครับ แค่นี้เราก็สามารถแผล่บให้ตัวเองได้แล้วครับ
เรื่องนี้เกิดช่วงต้นปี 57 ครับ ผมเพิ่งเคยใช้ 3G ผ่านมือถือเป็นครั้งแรกครับ เจ้าแรกที่ใช้คือ แมวเหมียวครับ 350 บาท/เดือน data unlimited ผมใช้ผ่าน aircard ครับไม่ได้เอาใส่โทรศัพท์แต่อย่างไรครับ
ถ้าใช้คำสั่ง ifconfig จะเห็นว่าคอมพิวเตอร์ได้ Ip address ในช่วง 10.x.x.x ครับ ซึ่งเป็น Private ip address ซึ่งโดยปกติอุปกรณ์ใน network address เดียวกันสามารถเข้าถึง services ต่าง ๆ ได้ครับ (เข้าใจว่าต้องประหยัด ip address เพราะขืน assign public ip ให้อุปกรณ์ mobile มีหวัง ip หมด range แน่นอนครับ)
ผมเลยลองใช้ nmap scan ดูพบว่ามี client up อยูจำนวนหนึ่ง แต่ปัญหาคือโดยปกติ 3G เราใช้กับโทรศัพท์ใช่ไหมครับ แล้วมี service ไหนที่เราสามารถเข้าถึงอุปกรณ์ได้โดยตรงหรือเปล่า สุดท้ายผมไปเจอว่าบน iphone ที่ jailbreak สามารถเข้าถึงผ่าน port 22 ได้ครับ
ซึ่ง jailbreak จะมี default username/password คือ root/alpine ครับ วิธีหาก็คือ > “ncrack -v –user root –pass alpine 10.x.x.x/24:22” ครับ ถ้า hit ncrack จะบอกเองครับ
เมื่อเราสามารถเข้าถึงอุปกรณ์ผ่าน ssh ได้แล้ว ก็สามารถเข้าถึงไฟล์ต่าง ๆ รวมถึง message/call log ได้ครับ ลองดู structure ของไฟล์บน iphone ได้ ที่นี่ ครับ
Note ผมแจ้งทางแมวเหมียวไปตอนนี้ใช้ nmap scan จะถูก fillter หมดแล้วครับ จริง ๆ ก็เป็นบทเรียนนะครับว่า product ที่เราไม่เคยทำมาก่อนจะมีปัญหาใหม่ซ่อนอยู่
Recent Comments