ບັນທຶກການຂຽນໂປແກມ ດູດກະທູ້ຈາກ Discuz ໄປວາງໃສ່ໃນ SMF
ສະບາຍດີ ຜູ່ອ່ານທີ່ໜ້າຮັກທັງຫຼາຍ ມື້ນີ້ຈະມາຈົ່ມກ່ຽວກັບການຂຽນໂປແກມເພື່ອໃຫ້ມັນ ດູດ content ໃນກະທູ້ໃນ webboard Discuz ອອກມາແລ້ວໄປໂພສໃນ SMF ອັດຕະໂນມັດພຽງແຕ່ໃສ່ລິ້ງ ແລະ ຂໍ້ມູນເພີ່ມເຕີມນິດໜຶ່ງ.
ເລື່ອງຂອງເລື່ອງແມ່ນລຸງໂອ້ດຢາກໃຫ້ຂຽນໂປແກມນີ້ຂຶ້ນມາເພາະຈະຍ້າຍບ້ານ Laozaa ຈາກ Discuz ໄປ SMF ແລະເພື່ອຄວາມສະດວກສະບາຍກໍ່ເລີຍຢາກໃຫ້ຂຽນໂປແກມນີ້ຂຶ້ນມາ.
ຜົນລັບ ແລະ ໂຄ໋ດຕາມລິ້ງນີ້ເລີຍເດີ້
https://github.com/frankxayachack/DiscuzThreadToSMF
ກ່ອນເຮົາຈະຂຽນ code ອອກມາໄດ້ເຮົາຕ້ອງວິເຄາະກ່ອນວ່າເຮົາຈະເຮັດຫຍັງແດ່
ສຳລັບໂປແກມນີ້ຜູ່ຂຽນສະຫຼຸບອອກມາໄດ້ດັ່ງນີ້:
1. Login Discuz
2. Fetch Content (Title & Content)
3. ລຶບຂໍ້ມູນທີ່ບໍ່ສຳຄັນອອກຈາກ Content ເຊັ່ນພວກ HTML tag ທີ່ບໍ່ຈຳເປັນ
4. Login SMF
5. Post ຂໍ້ມູນທີ່ໄດ້ລົງໃນ SMF (ຜູ່ໃຊ້ໂປແກມຕ້ອງບອກວ່າ Category ID ແມ່ນຫຍັງ)
ນີ້ຄືສິ່ງທີ່ເຮົາຈະເຮັດ
ສິ່ງທີ່ຜູ່ຂຽນນຳມາໃຊ້ເພື່ອຂຽນໂປແກມນີ້ຂຶ້ນມາ:
- Firefox (Foxy Proxy Adds-on ໃຊ້ Burp)
- Python 2.7.13
- Burpsuite (ສຳລັບອ່ານ Packet ທີ່ສົ່ງອອກ)
ສຳລັບໂປແກມເບິ່ງ Packet ຜູ່ອ່ານອາດຈະໃຊ້ HTTP Live, Tamper Data ແທນກໍ່ໄດ້ເພື່ອຄວາມສະດວກເພາະມັນເປັນ Adds-on ຂອງ Firefox ເລີຍ ແຕ່ຜູ່ຂຽນຖະໜັດໃຊ້ Burp ຫຼາຍກວ່າເລີຍເລືອກ Burp :)
Module Python ທີ່ໃຊ້ຈະມີ:
- requests
- bs4 (BeautifulSoup ເພື່ອຈັດການຂໍ້ມູນ html)
- requests_login.loginer (login Discuz ມີຄົນຂຽນໄວ້ແລ້ວເລີຍບໍ່ຕ້ອງຂຽນເອງສະບາຍໄປລະດັບໜຶ່ງ https://github.com/jxltom/requests-login )
- re (regular expression ສຳລັດຄັດກອງເຂົ້າຂໍ້ມູນທີ່ຕ້ອງການ http://www.regular-expressions.info/)
- hashlib (ສຳລັບເຂົ້າລະຫັດຂໍ້ມູນ)
Let’s Begin
ມາ! ເຮົາມາເລີ່ມວິເຄາະລະບົບກັນເລີຍ! Task ທຳອິດທີ່ເຮົາຈະເຮັດແມ່ນເຮົາຕ້ອງການ Login ເຂົ້າ Discuz ຖາມວ່າເປັນຫຍັງຕ້ອງ Login? ເພາະບາງກະທູ້ກະຈຳເປັນຕ້ອງ Login ກ່ອນຈຶ່ງເບິ່ງໄດ້ ແລະ ບາງກະທູ້ຕ້ອງຕອບກ່ອນຈຶ່ງເບິ່ງໄດ້ສະນັ້ນສິດທີ່ເຮົາຕ້ອງການແມ່ນ admin ເດີ້ພີ່ນ້ອງເດີ້ ເພາະ admin ບໍ່ຕອບກະເຫັນຂໍ້ຄວາມໄດ້.
ເຮົາມາກຳນົດຂໍ້ມູນທີ່ສຳຄັນກັນກ່ອນເນາະ (Initialize ເບິ່ງໃນ ໂຄ໋ດ)
ເພື່ອຄວາມສະດວກສະບາຍໃນການແກ້ໄຂ ຜູ່ຂຽນເອງເອົາມັນມາໂຮມຢູ່ບ່ອນດຽວກັນ
ວິທີການ Login Discuz ຈະບໍ່ຂໍອະທິບາຍເພາະເປັນການນຳໃຊ້ Module ທີ່ເຂົາກຽມໄວ້ແລ້ວ
ມີພຽງແຕ່ໃຊ້ຕາມ README ເລີຍ
ແຕ່ມັນກໍ່ຄືກັນກັບ SMF ນັ້ນແລະດຽວຕອນລຸ່ມໆຈະມີຂອງ SMF :)
ເມື່ອ Login ແລ້ວເຮົາກໍ່ໄດ້ Cookie ເພື່ອຍືນຍັນວ່າເຮົາເຂົ້າສູ່ລະບົບແລ້ວ
ໃນສ່ວນນີ້ຈະເປັນການດຶງເອົາ html ມາແລ້ວໂຍນເຂົ້າ BeautifulSoup ເພື່ອຄາມສະດວກ ໃນການຄັດກອງເອົາຂໍ້ມູນໃນ html
Code ທາງເທິງແມ່ນຈະທຳການ fetch ຂໍ້ມູນກະທູ້ມາຈາກ tag <td class=“t_f”> ແລະ ລຶບສ່ວນທີ່ບໍ່ຈຳເປັນອອກເຊັ່ນ ແກ້ໄຂຄັ້ງລ່າສຸດ tag ທີ່ເປັນການເຊື່ອງຂໍ້ມູນໃນ Discuz ເພາະແນວໃດກໍ່ບໍ່ໄດ້ໃຊ້ໃນ SMF ເຮົາກໍ່ຈຳເປັນຕ້ອງລຶບອອກ ແລະ ປ່ຽນຈາກ file= ເປັນ src=
ເທົ່ານີ້ເຮົາກໍ່ໄດ້ຂໍ້ມູນຈາກ Discuz ແລ້ວ! ເຊິ່ງຈະຖືກເກັບໃນໂຕປ່ຽນ Title ແລະ Final
ມາຕໍ່ກັບ SMF (ເລື່ອງມ່ວນມັນຢູ່ບ່ອນນີ້)
Task ທຳອິດຂອງ SMF ຄືການ Login ກ່ອນເພາະເຮົາຕ້ອງການໂພສກະທູ້
ເນື່ອງຈາກການ Login SMF ແມ່ນບໍ່ມີ module ໃຫ້ໃຊ້ເລີຍຕ້ອງໄດ້ຂຽນຂຶ້ນມາເອງເລີຍເນາະ
ປະເດີມດ້ວຍການໃຫ້ python ເຮົາສ້າງ session ຂຶ້ນມາກ່ອນ
ກ່ອນຈະ Login ໄດ້ເຮົາກະຕ້ອງຮູ້ກ່ອນວ່າ Client (ເຮົາ) ສົ່ງຂໍ້ມູນອັນໃດໄປ Server ຜູ່ຂຽນກໍ່ໄດ້ໃຊ້ Burpsuite intercept ເບິ່ງວ່າມີການສົ່ງ Packet ໂຕໃດໄປແດ່
ໃນນີ້ຜູ່ຂຽນ Login ໂດຍໃຊ້ username = admin & password = admin
ມັນກໍ່ຈະສົ່ງໄປທີ່ index.php?action=login2 ແລະມີຄ່າ
user
passwrd
cookielength
hash_passwrd
random_name = random_value
ທຳອິດກໍ່ປະກົດວ່າຜູ່ຂຽນເອງກໍ່ງົງ ວ່າອ້າວວບໍ່ສົ່ງຄ່າ passwrd ແຕ່ສົ່ງ hash_passwrd ໄປແທນແລ້ວຄ່າ hash_passwrd ແມ່ນຫຍັງບາດນີ້ ຈະເອົາມາແຕ່ໃສ ໄປເບິ່ງໃນ Source ກໍ່ເປັນຄ່າວ່າງເປົ່າ
ກໍ່ເລີຍຄິດວ່າຕ້ອງມີ javascript ຊ່ວຍບ່ອນນີ້ ຫຼັງຈາກນັ້ນກໍ່ ໄດ້ຕາມຫາຈົນໄປເຫັນໃນໄຟລ໌ Themes/default/scripts/scripts.js
ຟັງຊັ້ນ hashLoginPassword(doForm, cur_session_id) //ແຖວທີ 621
ແຖວ 636–637 ຈະເຫັນໄດ້ວ່າ ຟັງຊັ້ນນີ້ມັນ set value hash_passwrd ໃຫ້ເປັນການເຂົ້າລະຫັດແບນີ້ sha1(sha1(user+pass) + session_id)
ແລະ ເມື່ອເຮົາໄປເບິ່ງໃນ source code ຢູ່ເວັບ smf ກໍ່ມີການເອີ້ນໃຊ້ຟັງຊັ້ນ hashLoginPassword ຢູ່
ຈະເຫັນວ່າມີ Session_id ໃຫ້ເຮົາ fetch ມາໃຊ້ຢູ່ແລ້ວສະນັ້ນ hash_passwrd ສຳລັບ session ນີ້ຈະໄດ້ເປັນ e55d3a410e34c1741a9f05c3fff7c151a72d5f36
ຄ່າ hash_passwrd ຄືກັບໃນຮູບ burpsuite ທາງເທິງເລີຍແມ່ນບໍ່
ສຳລັບຄ່າ random hash 2 ໂຕ ແລະ session_id ນັ້ນການທີ່ເຮົາຈະແກະຄ່າອອກມາຈາກ html ໄດ້ເຮົາກໍ່ຈະໃຊ້ regex ຫຼື regular expression ເນາະ
user=admin&passwrd=&cookielength=-1&hash_passwrd=e55d3a410e34c1741a9f05c3fff7c151a72d5f36&c8e71054=b739af8671ad103b4aa816cdf7310e32
ອັນນີ້ແມ່ນ regular expression pattern ທີ່ຈະຊ່ວຍດຶງຂໍ້ມູນດັ່ງກ່າວອອກມາ ທັງ session_id & random hash field
ເມື່ອເຮົາໄດ້ຄ່າໝົດແລ້ວກໍ່ພຽງແຕ່ສົ່ງຄ່າດັ່ງກ່າວໄປ /index.php?action=login2
ເທົ່ານີ້ໂປແກມເຮົາກໍ່ສາມາດ Login ເຂົ້າລະບົບຂອງ SMF ໄດ້ແລ້ວ!
ການໂພສກະທູ້ໃໝ່
ກໍ່ຄືເກົ່າເນາະເຮົາມາດັກເບິ່ງກ່ອນວ່າ ເວລາເຮົາສ້າງກະທູ້ໜຶ່ງຈະມີ packet ຫຍັງຖືກສົ່ງໄປແດ່
ຈະເຫັນໄດ້ວ່າມັນສົ່ງຫຼາຍໆຄ່າໄປ ທີ່ index.php?action=post;start=0;board=1 ສະນັ້ນ destination ຂອງເຮົາແມ່ນສົ່ງຄ່າໄປ path ທາງເທິງນີ້ແລ້ວມາເບິ່ງວ່າເຮົາຕ້ອງສົ່ງຄ່າຫຍັງໄປແດ່
packet ທີ່ສົ່ງໄປ Server ຈະມີປະມານນີ້
ເຮົາກໍ່ຈັບແຕ່ລ່ະໂຕມາເຂົ້າ dict ແລ້ວສົ່ງຄ່າ post ໄປຄືກັນກັບ Login
ແຕ່ເນື່ອງຈາກ SMF ແມ່ນໃຊ້ bbcode ເປັນຫຼັກແລະ HTML tag disable by default ສະນັ້ນເຮົາຈຳເປັນຕ້ອງ ອະນຸຍາດໃຫ້ SMF ສາມາດນຳໃຊ້ basic HTML ໄດ້ກ່ອນໂດຍເຂົ້າໄປຕັ້ງຄ່າຢູ່
Admin Control Panel -> Post and Topics -> Bulletin Board Code tab and check “Enable basic HTML in posts”.
ພຽງເທົ່ານີ້ໂປແກມເຮົາກໍ່ສາມາດ fetch content ຈາກ Discuz ແລະ Post ລົງໃນ SMF ໄດ້ແລ້ວ
ອາດຈະອະທິບາຍບໍ່ລະອຽດຫຼາຍແຕ່ຄິດວ່າພໍຈະເຮັດໃຫ້ທຸກຄົນເຫັນພາບວ່າຜູ່ຂຽນໃຊ້ວິທີໃດໃນການຂຽນໂຄ໋ດຂຶ້ນມາ ແລະ ສຳລັບໃຜທີ່ມີວິທີທີ່ງ່າຍ ແລະ ດີກວ່ານີ້ສາມາດນຳມາແລກປ່ຽນຄຳເຫັນກັນໄດ້ເດີ້ :)
ຂອບໃຈທີ່ອ່ານຈົນສຸດ
- Frankkung (Frank Xayachack)