30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【Webサーバー(Apache・IISなど)】ローカルIPアドレスが漏えいしてしまうという脆弱性と対策について

ローカルIPがばれてしまう脆弱性


インターネットに公開している
Webサーバーについて
脆弱性の診断を受けたところ、
特定の条件下でローカルIPが露呈
されてしまう脆弱性が発見される


HTTPリクエストを送信する際、
・http1.0 で
・Hostヘッダを空白にして
・アドレスの末尾に/をつけない
という条件で発行

具体的には

 curl  -0  -i  -H  "Host:"  http://test.com/sample

のような感じでhttpリクエストを送信する

curlLinuxのコマンドのひとつ
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 で
回避できるらしいけど
気づかずにエンターキーやら
適当な操作をしてしまうと

見事消滅


しかもタチの悪いことに

 crontab -r 

でcrontabファイル自体を
消してしまっていれば
システム保守の監視に引っかかって
気づいたかもしれないが


ファイル自体は存在しているため
エラーにもならないという始末


ちなみにRedhat系のOSで
この事象が発生して
えらいことになったものの
Ubuntuでは再現しなかった
後発ゆえに危なっかしいところを
改修してくれているのだろう

【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(UEFI)が起動


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

無効に変更


BIOSを保存&終了して再起動
無事、Windows起動


しかし、中級者以上ならいざ知れず
初心者がこんな画面に出くわしたら
絶対対処しきれないと思うのだが…


とは言え、現代は
ほかのデバイスからいくらでも
ネットにアクセスできるから

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年から新たに動きはじめた
システムで年度が変わるまで
気づかなかったという
お粗末な話…