php-analyzer icon indicating copy to clipboard operation
php-analyzer copied to clipboard

Simple taint analyzer for PHP/WordPress using VKCOM/php-parser

php-analyzer

Current performance:
2022/05/28 12:41:35 Scanned 4981 files Found 428 vulns In time 25.159522618s

Input is filenames or URLs of PHP files.

Output is the PHP representation of the vertex of the assignment or sink and it's line:char position, along with the traced stack for each step in the path.

To do:

  • HTML context awareness
  • Don't traverse tree multiple times (and dont traverse dead code)
  • Scan whole repos instead of files (this will require more WP research)

Example:

$ echo test.php | php-analyzer -yaml
file: test.php
type: xss
path:
- stack: '[assign] $user_input <- [taint] $_GET'
  code: $user_input = $_GET['input'] 11:194
- stack: '[assign] $improperly_filtered <- [filter] MAGICQUOTES <- [taint] $user_input'
  code: $improperly_filtered = "$user_input" 12:224
- stack: '[sink] echo <- [taint] $improperly_filtered'
  code: |-
    // this does alert because magic quotes dont stop xss
    echo $improperly_filtered; 20:444

file: test.php
type: sqli
path:
- stack: '[assign] $t <- [assign] $param <- [taint] $_GET'
  code: $d->dangerous($_GET) 14:282
- stack: '[assign] $temp <- [filter] unknown_filter_func <- [taint] $param'
  code: $temp = unknown_filter_func($param) 4:51
- stack: '[assign] dangerous <- [taint] $temp'
  code: return $temp; 7:174
- stack: '[assign] $t <- [taint] dangerous'
  code: $t = $d->dangerous($_GET) 14:277
- stack: '[sink] query <- [taint] $t'
  code: |-
    // alerts because taint follows through method call into $t
    query($t) 23:532

2022/06/01 18:42:23 Scanned 1 files	Found 2 vulns	In time 4.785042ms

Help:

$ ./php-analyzer -h
Usage of ./php-analyzer:
  -d int
    	Number of times to traverse the tree (Tracing through function calls requires multiple passes) (default 10)
  -f string
    	Specify a data file of sources, sinks, and filters (default "data.yaml")
  -t int
    	Number of goroutines to use (default 100)
  -yaml
    	Output as YAML, (JSON by default)