Advertisement
Guest User

Untitled

a guest
May 1st, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.56 KB | None | 0 0
  1. <?php
  2.  
  3. class Logger
  4. {
  5. /*
  6. * string $logFile;
  7. */
  8. private $logFile;
  9.  
  10. /*
  11. * $lines[] log lines
  12. */
  13. private $lines = array();
  14.  
  15. /*
  16. * int $requestCounter
  17. */
  18. private $requestCounter = 0;
  19.  
  20. /*
  21. * string $lineRegex regex for nginx log line
  22. */
  23. private static $lineRegex = '/^(\S+) \S+ \S+ \[(.*?)\] "(\S+) (\/.+)\s.*?" (\d+) \d+ "(.*?)" "(.*?)"/';
  24.  
  25. /*
  26. * $maliciousPatterns[]
  27. */
  28. private static $maliciousPatterns = array(
  29. /*
  30. * detect (') (­­)
  31. */
  32. "/(\')|(\%27)|(\­\­)|(\#)|(\%23)/ix",
  33. /*
  34. * detect ('=')
  35. * login.jsp?username=bill&password=1234;select * from users
  36. */
  37. "/((\%3D)|(=))[^\n]*((\%27)|(\')|(\­\­)|(\%3B)|(;))/i",
  38. /*
  39. * // detect ('or')
  40. * 1' or '2'='2
  41. * 1' or 1<2­­
  42. */
  43. "/\w*((\%27)|(\'))(\s|\+|\%20)*((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix",
  44. /*
  45. * detect ('union') combinations
  46. */
  47. "/((\%27)|(\'))(select|union|insert|update|delete|replace|truncate)/ix",
  48. /*
  49. * XSS
  50. */
  51. "/(javascript|vbscript|expression|applet|script|embed|object|iframe|frame|frameset)/i"
  52. );
  53.  
  54. public function __construct($logFile)
  55. {
  56. $this->logFile = $logFile;
  57. $this->init();
  58. }
  59.  
  60. private function init()
  61. {
  62. $this->parseFile();
  63. }
  64.  
  65. public function parseFile()
  66. {
  67. $handle = fopen($this->logFile,'r');
  68.  
  69. if ($handle) {
  70. while (!feof($handle)) {
  71. $line = fgets($handle);
  72. $this->requestCounter++;
  73.  
  74. if (preg_match(self::$lineRegex, $line, $matches)) {
  75. array_push(
  76. $this->lines,
  77. array(
  78. 'ip' => $matches[1],
  79. 'time' => $matches[2],
  80. 'method' => $matches[3],
  81. 'uri' => $matches[4],
  82. 'status' => $matches[5],
  83. 'referer' => $matches[6],
  84. 'user-agent' => $matches[7],
  85. )
  86. );
  87. }
  88. }
  89.  
  90. fclose($handle);
  91. }
  92.  
  93. return $this->lines;
  94. }
  95.  
  96. public function getLines()
  97. {
  98. return $this->lines;
  99. }
  100.  
  101. public function getRequestCounter()
  102. {
  103. return $this->requestCounter;
  104. }
  105.  
  106. public static function getFilteredUri($logArray)
  107. {
  108. $maliciousUri = array();
  109. $fineUri = array();
  110.  
  111. foreach ($logArray as $log) {
  112. $uri = $log['uri'];
  113.  
  114. foreach (self::$maliciousPatterns as $regex) {
  115. if (preg_match($regex, $uri, $matches)) {
  116. $maliciousUri[] = $uri;
  117. continue 2;
  118. }
  119. }
  120.  
  121. $fineUri[] = $log['uri'];
  122. }
  123.  
  124. return array('fine_uri' => $fineUri, 'malicious_uri' => $maliciousUri);
  125. }
  126.  
  127. public static function asscArrayCountValues($array, $key)
  128. {
  129. $newArray = array();
  130.  
  131. foreach($array as $row) {
  132. $newArray[] = $row[$key];
  133. }
  134.  
  135. $newArray = array_count_values($newArray);
  136. arsort($newArray);
  137. return $newArray;
  138. }
  139. }
  140.  
  141.  
  142. $logger = new Logger('https://pastebin.com/raw/4TN69ktZ');
  143.  
  144. print '<pre>';
  145. print_r(sprintf('%u requests found', $logger->getRequestCounter()));
  146. print '</pre>';
  147. print '<hr/>';
  148. print '</br>';
  149.  
  150. print 'Status';
  151. print '<pre>';
  152. print_r(Logger::asscArrayCountValues($logger->getLines(), 'status'));
  153. print '</pre>';
  154. print '<hr/>';
  155. print '</br>';
  156.  
  157. print 'Referer';
  158. print '<pre>';
  159. print_r(Logger::asscArrayCountValues($logger->getLines(), 'referer'));
  160. print '</pre>';
  161. print '<hr/>';
  162. print '</br>';
  163.  
  164. print 'User-Agent';
  165. print '<pre>';
  166. print_r(Logger::asscArrayCountValues($logger->getLines(), 'user-agent'));
  167. print '</pre>';
  168. print '<hr/>';
  169. print '</br>';
  170.  
  171. print 'URI';
  172. print '<pre>';
  173. print_r(Logger::asscArrayCountValues($logger->getLines(), 'uri'));
  174. print '</pre>';
  175. print '<hr/>';
  176. print '</br>';
  177.  
  178.  
  179. print 'Malicious URI\'s';
  180. print '<pre>';
  181. print_r(Logger::getFilteredUri($logger->getLines())['malicious_uri']);
  182. print '</pre>';
  183. print '</br>';
  184.  
  185. print 'Fine URI\'s';
  186. print '<pre>';
  187. print_r(Logger::getFilteredUri($logger->getLines())['fine_uri']);
  188. print '</pre>';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement