Category: Web 開發

(中文) [安全漏洞][案例#004][WEB]富邦網路特店收單[信用卡](台北富邦銀行)

案例#4

富邦網路特店收單(信用卡)

Yang 聲明

此為研究案例,目的在於讓各位了解 APP 開發時嚴謹性及需要注意資安的重要。

請勿直接使用此文章方法。

購物付款流程

首先先介紹整個購物付款流程

流程請參考 [安全漏洞][案例#002][WEB]歐付寶金流整合(信用卡)

漏洞檢視:

1 透過 client 端裝置(瀏覽器)進行資料傳送。駭客可以攔截修改這些轉址時所夾帶的內容。

當透過富邦信用卡平台完成交易後,銀行端會透過我們的瀏覽器傳回資料到商家網站

網址如下:

http://mywebsite.com?MERCHANTID=xxxxxxx&TERMINALID=xxxxxx&ORDERID=xxxxx&

TRANSAMT=5000&TRANSMODE=0&TRANSDATE=20170926&TRANSTIME=203900&
RESPONSECODE=0&RESPONSEMSG=&APPROVECODE=12345&SYSORDERID=12345&
BATCHNO=123456&TRANSCODE=00

2 僅需修改紅字部分。

將 TRANSAMT改為正確金額,RESPONSECODE改為0然後送出後,可以讓「購物網站」以為真的有付款成功

修改前購物車結果

螢幕快照 2017-09-28 上午9.50.15

修改後購物車結果:

螢幕快照 2017-09-28 上午9.51.09

作者早先有致電富邦反應此問題,但他們的回覆是做法不會修改。建議是事後去富邦後台查詢是否真的有入帳,或是透過查詢交易明細的API查詢。

如果有其他網物商店需要串接富邦,建議不要直接拿回傳的結果當作成功交易的依據,這是會有風險的

Tags :

(中文) [安全漏洞][案例#003][WEB]網易收金流整合[信用卡](永豐銀行)

案例#3

網易收金流整合(信用卡)

Yang 聲明

此為研究案例,目的在於讓各位了解 APP 開發時嚴謹性及需要注意資安的重要。

請勿直接使用此文章方法。

購物付款流程

首先先介紹整個購物付款流程

流程請參考 [安全漏洞][案例#002][WEB]歐付寶金流整合(信用卡)

漏洞檢視:

1 透過 client 端裝置(瀏覽器)進行資料傳送。駭客可以攔截修改這些轉址時所夾帶的內容。

當透過永豐信用卡平台完成交易後,銀行端會透過我們的瀏覽器傳回資料到商家網站

網址如下:

http://mywebsite.com?OrderNO=L1600107&ShopNO=AA0090&

KeyNum=3&TSNO=AA00900001068&
PayType=C&Amount=47000&
Status=F&
Description=S00000&
Digest=a23a8dcc322183e965e35ea86d0168f6ab
&Param1=1&Param2=0000000000&Param3=
2 僅需修改紅字部分。

將 Status=F 改為 Status=S 然後送出後,可以讓「購物網站」以為真的有付款成功

修改前購物車結果

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-25-%e4%b8%8a%e5%8d%8810-31-36

修改後購物車結果:

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-25-%e4%b8%8a%e5%8d%8810-31-27

雖然永豐有想到資料竄改問題,而提出 digest 驗證機制

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-25-%e4%b8%8a%e5%8d%8810-34-38

但是商店透過此驗證機制產生出來的結果,居然跟夾帶於網址內的 digest 是相同的。

但永豐並沒有把 Status=F 這部分加在驗證公式裡面,導致我們還是可以竄改資料 ORZ。。。

2016-12-28 更新

與永豐回報此問題後,永豐很快地在 12/28  patch 掉此問題。在金融業這樣的效率算是很高。

Tags :

[Q&A]open unicode file in tomcat

add URIEncoding=”UTF-8″ in server.xml

1
2
3
4
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
Tags :

[Q&A]mysql supports utf8mb4

my.cnf

1
2
3
4
5
6
7
8
9
10
11
[client] 
default-character-set = utf8mb4
 
[mysql] 
default-character-set = utf8mb4
 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
init_connect='SET NAMES utf8mb4'

JDBC connector

remove characterEncoding=utf8

1
<property name="url" value="jdbc:mysql://localhost:3306/tomali?useUnicode=true&autoReconnect=true"/>
Tags : ,

[QA]How to set php upload_max_filesize in .htaccess?

php_value upload_max_filesize 10M

need enable AllowOverride in root

AllowOverride Options
Tags :

[問題] servlet 如何獲得 request URL

假設 Request Servlet URL 如下:

http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=456

獲得 RequestURL 完整路徑:

/**
*
* @param req
* @return http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=456
*/
public static String getRequestURL(HttpServletRequest req) {
   String reqUrl = req.getRequestURL().toString();
   String queryString = req.getQueryString(); // d=456
   if (queryString != null) {
      reqUrl += "?"+queryString;
   }
   return reqUrl;
}

獲得 Request URI:

/**
*
* @param req
* @return /mywebapp/servlet/MyServlet/a/b;c=123?d=456
*/
public static String getRequestURI(HttpServletRequest req) {
   String reqUri = req.getRequestURI().toString();
   String queryString = req.getQueryString(); // d=456
   if (queryString != null) {
      reqUri += "?"+queryString;
   }
   return reqUri;
}

獲得 Request Root URL:

/**
*
* @param req
* @return http://hostname.com/mywebapp
*/
public static String getRootURL(HttpServletRequest req) {
   String scheme = req.getScheme(); // http
   String serverName = req.getServerName(); // hostname.com
   int serverPort = req.getServerPort(); // 80
   String contextPath = req.getContextPath(); // /mywebapp
// String pathInfo = req.getPathInfo(); // /a/b;c=123
// String queryString = req.getQueryString(); // d=456
   String url = scheme+"://"+serverName+":"+serverPort+contextPath;
   return url;
}
Tags : ,

[QA] How to get the path of remote app in tomcat

HttpServletRequest

request.getSession().getServletContext().getRealPath("/");

Servlet

this.getServletContect().getRealPath("/");

Structs

this.getServlet().getServletContext().getRealPath("/");

ClassLoader

File classes = new File(getClass().getClassLoader().getResource("").getFile());
 
String path = classes.getParentFile().getParent() + "/";
 
path = java.net.URLDecoder.decode(path, "utf-8");
Tags :

[教學] 在 MacOS 下讓 wordpress 使用固定網址

1. 建立 .htaccess 並讓 wordpress 有權限修改

$ cd web_site_root_directory
$ touch .htaccess
$ sudo chown _www .htaccess

2. 修改以你網站名稱命名的 .conf, 以 MacOS 10.6.7 為例,位於 /private/etc/apache2/sites 。

找到 "AllowOverride""None" 改成 "All"

3. 重新啓動 web service

Tags : ,

[問題] mysql error 1025 (errorno: 150) 怎麼解決

alter table MY_TABLE drop foreign key my_table_ibfk_1;
alter table MY_TABLE drop column MY_COLUMN;
Tags :

[問題]如何在 MySQL 使得 SELECT case sensitive

使用 BINARY 關鍵字

SELECT * FROM my_table WHERE BINARY col_name = 'SoME wORd';
Tags :