【Webサーバー(Apache・IISなど)】ローカルIPアドレスが漏えいしてしまうという脆弱性と対策について
ローカルIPがばれてしまう脆弱性
インターネットに公開している
Webサーバーについて
脆弱性の診断を受けたところ、
特定の条件下でローカルIPが露呈
されてしまう脆弱性が発見される
HTTPリクエストを送信する際、
・http1.0 で
・Hostヘッダを空白にして
・アドレスの末尾に/をつけない
という条件で発行
具体的には
curl -0 -i -H "Host:" http://test.com/sample
のような感じでhttpリクエストを送信する
curl はLinuxのコマンドのひとつ
Windowsでもパッケージがあるので
インストールすればコマンドプロンプト
から使える
ちなみにオプションは
-0 : http 1.0 を指定 -i :リクエストヘッダを表示 -H :リクエストヘッダを編集
すると
オブジェクトは移動しました このドキュメントは http://192.168.0.10/sample/ ここで見つかる可能性があります
などとローカルIPが表示されるというもの
まず httpリクエストの規格の理解
httpリクエストにもバージョンがあって
だいたいデフォルトでhttp1.1が適用される
httpリクエストのヘッダのなかには
Host というステータスがあり
http1.1以降は必須項目となっている
この Host を元にアクセス先のURLを
決めてたりするので当然といえば当然
ところが旧規格である http1.0 では
Host が必須ではないので空白で
リクエストを送ることもできる
Host が空白のリクエストを送信されると
Webサーバーは困ってしまい
とりあえず自身の IP をホストとして返す
これがローカルIPのため漏えいにつながる
というもの
思うに、http1.0 でリクエストが
送信されることが想定されていないために
その辺の設定がおろそかになっているのだと思う
そんな旧規格は使えないようにすれば
いいんじゃないかと言いたいところだけど
まだまだ使用しているサービスがあって
そうもいかないらしい
リダイレクトの仕組み
http://test.com/sample/
と末尾に / をつけるとそのフォルダを
指定したことになるのだけど
http://test.com/sample
と / をつけないとsampleという
ファイルを探しに行く
が、見つからない状態となる
sample という名のフォルダが実在した
場合、Webサーバーは親切?にも
sample はフォルダのことかもしれない
と判断してくれて、ファイルは
sample フォルダで見つかるかもよ!
とメッセージをだしてくれる
というリダイレクトの処理が
裏側では走っているらしい
しかし、、
とんだマニアックな指摘で
そんなとこまで対策せんでも…
と思うのも人情だけど
とあるサイトで
Webサーバーを公開することは
家のドアを開けてチンピラを呼び寄せる
ようなもの、と説明されていて
妙に納得感があった
公開する以上は常に危険に晒されている
わけであって、万全の対策が必要で
あることもまた真理
実際、同じ手口?でアクセスがあって
アラートメールがとんできていたりして
IPの身元を調べるとドイツからのアクセス
だったりした
もちろん踏み台の可能性も多分にあるが
せっかく調べてもらって
当人達には気づかないような指摘を
いただいたのだから、
ありがたく対策を講じるのが
肝要だと思うのであった
【Linux】crontabをオプションなしで起動してはいけない
crontabとはLinxのサービスのひとつ
決まった時間にタスクを実行してくれる
Windowsで言うところの
タスクスケジューラ
さて、このcrontab
コマンドのあとに
-e (編集) -l (閲覧) -r (削除)
などのオプションをつけて
起動することができ
どう考えても -r あたりはやばいことは
明白なのだけど
実はオプションなしで実行すると
場合により大変なことになる
いやいや普通オプションなしで
実行しても別に変な動きしないでしょ
と考えてしまうところだが、、
crontabの内容が書き換えられてしまう
crontab
だけで実行すると
端末側は
crontab XXXX
crontabの内容をXXXXファイルの
内容に置き換えろ
という意味になるらしい
つまり空白で実行すると
空白に書き換えろという
ことになってしまう!
どうやら Ctrl + C で
回避できるらしいけど
気づかずにエンターキーやら
適当な操作をしてしまうと
【Windows】EFI Shell version xx [x.xxx]と表示されて起動しない
Windows10のPCを
立ち上げようと思ったら
いきなり
EFI Shell version xx [x.xxx] Current running mode x.x.x Device mapping table blk0 :BlockDevice - Alias (null) PciRoot(0x0)/Pci(0x11,0x0)/Sata(0x1,0x0) blk1 ・ ・ ・ Press ESC in 1 seconds to skip startup.nsh, any other key to continue. Shell>
とDOS画面に表示され
Windowsが起動しない事象に遭遇
とりあえず
Shell>exit
exitと入れて終了させると
BIOSを終了すると
再起動するものの
またEFI Shellの画面で
エンドレス
原因
調べたところ、
EFI Shellとは
ブートするデバイスを選ぶ機能
この画面がでるということは
起動用の
ハードディスクが認識されていない
ということ
BIOS(UEFI)の画面のステータス
みたいなところを確認すると
HDD Not Present
の文字
確かにHDDが認識されていない…
今日び内臓HDDのみに重要なデータを
保管しているわけでもないので、
最悪ハードが死んでも
大丈夫といえば大丈夫だけど
やっぱり地味に痛い
そんなに古いわけでもないし
まさかハードディスク逝ってないよなぁ
まさかなぁ、とか思いながら
デスクトップのケースを開ける
SATAケーブルや電源ケーブルくらいなら
買い替えれば何とかなる
抜きさししたり、
別のポートにさしたり、、
少しづつ祈るような気持ちになってくる
のは否めない
そして
Blue-rayドライブにささってた
SATAケーブルを拝借して
ハードディスクにさし替えると
認識された!起動
「まぁそんなとこだよな」
という気持ちよりも
「よかったマジで」
のほうが最終的には
勝ったという
ちょっと焦った話
【Java】サーブレット・jsp間のデータ受け渡し方法と、SubmitしてPOST・GETでリクエストを送信するとデータが重複して送られてくる件
JavaでWebアプリケーションを開発中
たいがい多いのは
サーブレットとjspを連携
させるパターン
サーブレット⇔jsp間で
POST・GETで数値をやりとり
という概念を理解するのに
なかなか苦労した
っていうかPHPだったら
こんなに苦もなく
htmlに組み込んで書けるのに
とは思うけど今は
いろんな言語を覚えることが
きっと何かの役にたつ(はず)
で、いろいろ試行錯誤して考えたのが
可変の2次元配列でデータ受け渡し
2次元配列というと
String[][]
あたりが思い浮かぶけど
これは先に上限値を設定
しないといけないので
個人的には使いにくい
なので
ArrayList<ArrayList<String>>
可変の2次元配列を使用して
java側でDBのデータを取得し
サーブレットに送った上で
jspに渡したり
jspからPOST・GETで送られた
データをサーブレットで
2次元配列として受け取ったり
具体的にはjsp側で
<form method="post"> <input type='text' name='y[]' value=''> <input type='text' name='z[]' value=''> <input type="submit" name="submit" value="submit"> </form>
的なかんじで
配列のデータをPOSTで送る
サーブレットでは
public static ArrayList<ArrayList<String>> x; … ArrayList<String> xx = new ArrayList<String>(); if なんちゃらかんちゃら for なんちゃらかんちゃら xx.add(request.getParameterValues("y[i]")); xx.add(request.getParameterValues("z[i]")); … x.add(xx);
的なかんじで
受け取ったPOSTの配列を
可変2次元配列に格納する
受け取ったデータを表示すると
なぜか重複して送られてきている…
エラーはでてない
原因として目がいくのは
ifとかforのあたりなわけで
何度も見直したけど
たぶん間違いはない
よくよく挙動を見ると
1回目のSubmitでは
正常なデータで
2回目のSubmitで
重複したデータ
いつも2回目でおかしいと
思って止めてしまっていて
謎が解けなかったけど
3回目で送信すると
データが3重になった!
ということでやっと
変数が初期化されていない
ことに気づく
public static ArrayList<ArrayList<String>> x; … x = new ArrayList<ArrayList<String>>(); ArrayList<String> xx = new ArrayList<String>(); if なんちゃらかんちゃら for なんちゃらかんちゃら xx.add(request.getParameterValues("y[i]")); xx.add(request.getParameterValues("z[i]")); … x.add(xx);
変数を初期化する
new ~ を追加して
やっと解決
これで費やした時間
実に約1日…
とりあえず動けばいいや的なノリで
コードを書いてしまうことが多くて
変数の宣言やら初期化やら
はしょってしまうことがあるのですが
やっぱりそれぞれにちゃんと
意味があって
まずは教科書通りにやらないと
時間を無駄にするんだなぁ、と教訓
【VBS】特定のフォルダにファイルが作成されたら自動的にメールに添付して送りたい
最近、ここに投稿するネタがないなぁ
とか思ってたわけですが、
ここのところもっぱら
つまらない資料作成と、
くだらない社内調整と、
意味のない打ち合わせに
終始していたから。
たとえ忙しかったとしても
アウトプットするものが
ないってことは
やはり無駄な時間を過ごしていた
と切に感じるのでありました。
で、久々にお題がでたわけで
(こういうのを待ってた)
サーバー内の特定のフォルダにファイルが自動作成されるので作成次第、メールで送りたい
環境はWindows Server
さて、どうするか。
タスクスケジューラを使うのは確定として
トリガーは?
ファイルが作成されたことをログからとる?
Windowsのシステムに関するログは
どこかにはあるんだろうけど、、
ハードルが高そうなので却下。
あとタスクスケジューラからの
メールも可能だけど
添付ファイルはつけられないっぽい
のでこちらも却下。
結局、
VBSでコードを書いて毎日実行
作成日付が当日のファイルがあれば
メールに添付して送付という
条件分岐をVBで書いて
VBSファイルにして保存
タスクスケジューラから毎日実行
'変数の宣言 Dim objFileSys Dim objFolder Dim objFile Dim today Dim AttachFlag 'メールを扱うオブジェクトを作成 Set objMail = CreateObject("CDO.Message") 'ファイルシステムを扱うオブジェクトを作成 Set objFileSys = CreateObject("Scripting.FileSystemObject") 'フォルダを設定 Set objFolder = objFileSys.GetFolder("C:\xxx\test") '当日日付の取得 today = Left(Now(),10) '添付フラグ AttachFlag = 0 '送信元 objMail.From = "xxx@xxx.co.jp" '宛先 objMail.To = "xxx@xxx.co.jp" 'CC objMail.Cc = "xxx@xxx.co.jp" 'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得 For Each objFile In objFolder.Files '取得したファイルの作成日が本日ならをファイルを添付およびフラグON If Left(objFile.DateCreated,10) = today Then objMail.AddAttachment objFolder & "\" & objFile.Name AttachFlag = 1 End If Next objMail.Subject = "件名" objMail.TextBody = "本文" '送信方法 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 'SMTPサーバ objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.x.x" 'SMTPポート objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 'SSL通信をしない objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False 'SMTP認証 'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 'SMTP送信ユーザ名 指定なし 'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx@xxx.com" 'SMTP送信ユーザパスワード 指定なし 'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx" 'タイムアウト 指定なし 'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30 '更新、必要な処理らしい objMail.Configuration.Fields.Update '添付ファイルがあればメールを送信 If AttachFlag = 1 Then objMail.Send End If '変数をリセット Set objMail = Nothing Set objFileSys = Nothing
【Windows】Start PXE over IPv4 および IPv6と表示されて起動しない
Windows10のPCを
立ち上げようと思ったら
いきなり
>>Checking Media Presence >>Media Present >>Start PXE over IPv4.
とDOS画面に表示され
Windowsが起動しない事象に遭遇
しばらく待つと
>>Checking Media Presence >>Media Present >>Start PXE over IPv6.
とIPv6に表示が変わり
さらに待つと
BIOSが起動
BIOSを終了すると
再起動するものの
またいちばん最初の画面で
エンドレス
回避方法
Windowsのブートには
デフォルトの
ハードディスク以外に
DVDやらUSB、
はたまた今やネットから
OSを起動できるらしい
Windows98の頃は
フロッピーからブートが
定番だったが進化したものだ
で、IPv4とか6の文字から
推測できるように
ネットからのOSブート機能が
原因らしい
おそらくWindowsのアップデート
あたりで、おせっかいにも
この辺の機能を触られて
おかしな挙動になった気がする
なので
BIOSの設定から
UEFI:IP4 GBE Family Controller Enable UEFI:IP6 GBE Family Controller Enable
みたいな項目を見つけ出して
これを
UEFI:IP4 GBE Family Controller Disable UEFI:IP6 GBE Family Controller Disable
無効に変更
しかし、中級者以上ならいざ知れず
初心者がこんな画面に出くわしたら
絶対対処しきれないと思うのだが…
とは言え、現代は
ほかのデバイスからいくらでも
ネットにアクセスできるから
GooGle先生に聞けば
たいがい何とかなるか
【SQL】新年になったらデータが消えた SYSDATEとADD_MONTHS
新年あけまして出社早々、
データが消えたとかでお怒りの
電話をいただきました。
テーブルとSQLの仕様
※DBはOracle
テーブル構造
NENGETU 201810 201811 201812
データをとってくるSQL
SELECT * FROM TABLE WHERE NENGETU BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -27), 'YYYY') * 100 + 4 AND TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY') * 100 + TO_CHAR(SYSDATE, 'MM') -1
こんな感じで3年前の4月から先月までのデータをとってくる
が、
よく見ると
TO_CHAR(SYSDATE, 'MM') -1
単純にシステム日付の月からマイナスしている
そうすると計算結果は
201800
つまり201603から201800までの
データをとってくるSQLになり
ほとんどの "データが消えた"
なので
TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM')
ADD_MOTNHSをつけてあげることで
ちゃんと201812となるように修正
2018年から新たに動きはじめた
システムで年度が変わるまで
気づかなかったという
お粗末な話…