最近看了下tpshop,审计出几个鸡肋的漏洞,这个SQL注入漏洞是其中之一。然后审计完网上搜了一下发现有一堆后台的sql注入漏洞,应该是觉得后台的SQL不用修叭(我个人是可以理解的)。
漏洞触发点首先要登录后台,这也是我说漏洞很鸡肋的原因。漏洞位于在后台的商城-》文章->文章列表处的搜索抓包,存在漏洞的参数是keywords,当输入payload‘ or length(database())=10)#
时,页面返回文章数0,
而当输入payload‘ or length(database())=9)#
时,页面返回为共33篇文章(总共33篇,数据库名是tpshop2.0)
因此可以通过布尔注入来获取数据库信息,当然延时也可以,只不过我自己是能不用延时就不用延时的人。
漏洞成因,分析下代码分析下代码,原因很简单,where直接拼接了。并且会将查询到的结果返回到页面中。application/admin/controller/Article.php:56
$keywords = trim(I(‘keywords‘)); $keywords && $where.=" and title like ‘%$keywords%‘ "; $cat_id = I(‘cat_id‘,0); $cat_id && $where.=" and cat_id = $cat_id "; $res = $Article->where($where)->order(‘article_id desc‘)->page("$p,$size")->select(); $count = $Article->where($where)->count();// 查询满足要求的总记录数 $pager = new Page($count,$size);// 实例化分页类 传入总记录数和每页显示的记录数 //$page = $pager->show();//分页显示输出 $ArticleCat = new ArticleCatLogic(); $cats = $ArticleCat->article_cat_list(0,0,false); if($res){ foreach ($res as $val){ $val[‘category‘] = $cats[$val[‘cat_id‘]][‘cat_name‘]; $val[‘add_time‘] = date(‘Y-m-d H:i:s‘,$val[‘add_time‘]); $list[] = $val; } } $this->assign(‘cats‘,$cats); $this->assign(‘cat_id‘,$cat_id); $this->assign(‘list‘,$list);// 赋值数据集 $this->assign(‘pager‘,$pager);// 赋值分页输出 return $this->fetch(‘articleList‘);
最后执行的sql语句为:
其他我在用payload的时候用的是=,是因为输入做了过滤,会转义> <,用大于号不能直接执行sql,会报错。
某shop后台sql注入漏洞
标签:alt false 列表 his etc 存在 order gic fetch
小编还为您整理了以下内容,可能对您也有帮助:
sql注入漏洞如何修复9
一、打开domain4.1,在旁注检测—”当前路径”中输入服务器的域名或IP地址。
二、点击“连接”,在“网页浏览”中显示打开的网页,并自动检测注入点,在“注入点:”中显示结果。
三、选择任何注射点,然后单击-“检测注射”。
四、对注射点进行注射检测,点击-'开始检测。
五、点击“猜测表名”,选择“管理员”,点击“猜测列名”,选择“密码”和“管理员”,点击“猜测内容”。密码是用MD5加密的,可以用在线密码破解。
六、在“管理门户扫描”中进行后台扫描,结果如下。
七、右击获取的地址,进入后台管理登录界面。
sql注入漏洞如何修复9
一、打开domain4.1,在旁注检测—”当前路径”中输入服务器的域名或IP地址。
二、点击“连接”,在“网页浏览”中显示打开的网页,并自动检测注入点,在“注入点:”中显示结果。
三、选择任何注射点,然后单击-“检测注射”。
四、对注射点进行注射检测,点击-'开始检测。
五、点击“猜测表名”,选择“管理员”,点击“猜测列名”,选择“密码”和“管理员”,点击“猜测内容”。密码是用MD5加密的,可以用在线密码破解。
六、在“管理门户扫描”中进行后台扫描,结果如下。
七、右击获取的地址,进入后台管理登录界面。
什么是SQL注入漏洞?
SQL注入是一种高危漏洞,其产生的危害包括:数据泄露、数据篡改、身份伪装、拒绝服务(DoS)攻击、应用程序漏洞。
1、数据泄露:攻击者可以利用SQL注入漏洞来访问、检索和下载数据库中的敏感数据,如用户凭证、个人信息、财务数据等。
2、数据篡改:攻击者可以修改数据库中的数据,包括插入虚假信息、更改记录或删除数据。这可能导致信息不一致、损坏或无法恢复。
3、身份伪装:攻击者可以利用SQL注入来冒充合法用户,绕过身份验证并执行未经授权的操作,如更改密码、访问受限资源等。
4、拒绝服务(DoS)攻击:恶意的SQL注入可以导致数据库服务器负载过重,从而降低系统性能,甚至导致系统崩溃,导致拒绝服务。
5、应用程序漏洞:SQL注入可以用作攻击者入侵应用程序的入口点,从而获取更多权限,探测其他漏洞或攻击系统的其他部分。
如何预防SQL注入
1、使用参数化查询:最有效的预防SQL注入攻击的方法之一是使用参数化查询(Prepared Statements)或预编译查询。这些查询会将用户输入作为参数传递,而不是将输入直接插入SQL查询字符串中。这样可以防止攻击者通过注入恶意SQL代码来修改查询的结构。
2、输入验证和过滤:对于用户输入的数据,进行严格的验证和过滤,只接受符合预期格式的数据。使用白名单而不是黑名单,只允许明确允许的字符和格式。
3、不信任的数据转义:对于用户输入的数据,使用适当的转义函数或机制来确保特殊字符不会被解释为SQL代码。这可以防止攻击者通过输入恶意字符来绕过输入验证。
4、最小权限原则:数据库用户的权限,确保它们只能执行必要的操作。不要将数据库用户赋予不必要的权限,以减小潜在攻击的影响范围。
如何防范SQL注入漏洞及检测
SQL注入漏洞攻击的防范方法有很多种,现阶段总结起来有以下方法:
(1)数据有效性校验。如果一个输入框只可能包括数字,那么要通过校验确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符,最好的方法是增加字符复杂度自动验证功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。另外表单数据输入和查询字符串输入的长度也是一个好方法。如果用户的登录名最多只有10个字符,那么不要认可表单中输入10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
(2)封装数据信息。对客户端提交的数据进行封装,不要将数据直接存入cookie中,方法就是在编程的代码中,插入session、if、try、else,这样可以有效地防止攻击者获取cookie中的重要信息。
(3)去除代码中的敏感信息。将在代码中存在的用户名、口令信息等敏感字段删除,替换成输入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:这样显然会暴露管理员的用户名、口令信息。可以将其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
这样就安全了很多,入侵者也是不会轻易的就获取到用户名、口令信息。
(4)替换或删除单引号。使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注入漏洞攻击,单引号时常会无法约束插入数据的Value,可能给予输入者不必要的权限。用双引号替换掉单引号可以使大部分SQL注入漏洞攻击失败。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
显然会得到与
“select * from users where username='admin' and password= '1234567'”
相同的结果。
(5)指定错误返回页面。攻击者有时从客户端尝试提交有害代码和攻击字符串,根据Web Service给出的错误提示信息来收集程序及服务器的信息,从而获取想得到的资料。应在Web Service中指定一个不包含任何信息的错误提示页面。
(6)SQL字符串连接的配置文件。使用SQL变量,因为变量不是可以执行的脚本,即在Web页面中将连接数据库的SQL字符串替换成指定的Value,然后将Web.config文件进行加密,拒绝访问。
(7)设置Web目录的访问权限。将虚拟站点的文件目录禁止游客用户(如:Guest用户等)访问,将User用户权限修改成只读权限,切勿将管理权限的用户添加到访问列表。
(8)最小服务原则。Web服务器应以最小权限进行配置,只提供Web服务,这样可以有效地阻止系统的危险命令,如ftp、cmd、vbscript等。
(9)鉴别信息加密存储。将保存在数据库users表中的用户名、口令信息以密文形式保存,也可以对users表进行加密处理,这样可以大大增加对鉴别信息访问的安全级别。
(10)用户权限分离。应尽可能的禁止或删除数据库中sa权限用户的访问,对不同的数据库划分不同的用户权限,这样不同的用户只能对授权给自己的数据库执行查询、插入、更新、删除操作,就可以防止不同用户对非授权的数据库进行访问。