#!/usr/bin/perl
# 20130429_XSS.pl - XSS log scanner
# Development by Dekisugi@0chplusProject 2013.04.30

# このスクリプトをCGIとして実行しないこと！！
#
# よくわからない人は、このスクリプトは使わずに
# 管理ユーザ全員のパスワードを変更してください


# 管理画面でレス一覧のページを開くとパスワードが抜かれてしまう脆弱性が発見されました。
# このスクリプトは、それを利用した攻撃がされていないかのチェックをお手伝いするものです
#
# このスクリプトは作者が自身で利用するために作成したものです。
# おすそわけとして、掲示板管理者の省力化のために提供しております。
# よって使い方は説明しません。動作保証もありません。
# ソースを読んでやっていることを理解し、環境に合わせてスクリプトを修正してください。
# 技術を不要とするものではございません。
# わからなければ管理ユーザー全員のパスワードを変更してください。
#
# SETTING.TXTの書き込みログ保存数は、初期状態ではどんどん流れていく設定になっています。
# よって必ずしもすべての掲示板で有効に使えるスクリプトではございません。
# むしろこのスクリプトを実行することが無意味な掲示板の方が多いです。
# ログが流れていたら元も子もありません。過去にパスワードを抜かれている可能性もございます。
# 検査結果によらず、最終的にはあなた自身で判断してください。
#
# 判断に迷ったら管理ユーザ全員のパスワードを変更する！




use strict;
use warnings;

&xss( $ARGV[0] or "./" );

sub xss {
	# ログ保管ディレクトリ
	# 設定を変更している場合は書き換えてください
	my $logdir = "log/";

	my $root = shift;

	my ( @dir );

	opendir ( DIR, $root );
	foreach my $ls ( sort readdir DIR ) {
		if ( $ls =~ /^\.\.?$/ ) {
			next;
		} elsif ( -d $root.$ls ) {
			push @dir, "$root$ls/";
		}
	}
	closedir DIR;


	foreach my $target ( @dir ) {
		unless ( -d $target.$logdir ) {
			print "skip: $target\n";
			next;
		}
		print "IN: $target\n";
		opendir ( DIR, $target.$logdir );

		foreach my $ls ( sort readdir DIR ) {
			if ( $ls =~ /^\.\.?$/ ) {
				next;
			} elsif ( -d $target.$logdir.$ls ) {
				next;
			} elsif ( $ls =~ /^\d+\.cgi$/ ) {
				&kensa( $target.$logdir.$ls, 8 );
			} # 独自形式のログがある場合はここでelsifしていく感じで
			
			
		}
		closedir DIR;
		print "DONE: $target\n\n";
	}

	print "0chplus root: $root\n";
	print "Complete.\n";

}


sub kensa {
	my $file = shift;
	my $kugyu = shift;

	my $gyou;

	open LOG, "< $file";
	my @log = <LOG>;
	close LOG;

	foreach my $line ( @log ) {
		$gyou ++;
		$line =~ s/\x0d?\x0a?$//;

		my $sore = (split '<>', $line)[$kugyu];

		if ( $sore =~ /[<>]/ ) {
			print "  $file($gyou): $sore\n";
		}

	}

}


1;

