SQL注入经常发生在与数据库交互的地方
http请求中的user-agent、client-ip、x-forward-for等可能会被程序存储到数据库中。 另外,在订单处理中,由于业务逻辑复杂,常常存在二次注入漏洞。
GET /test.php HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0//告诉服务器把客户端的信息 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 X-Forwarded-For: 8.8.8.8//XXF头,用于显示客户端的IP地址可以有多个,用逗号隔开。 Connection: keep-alive Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0
•User-Agent:允许服务器识别客户使用的操作系统、浏览器版本等。 (很多数据量大的网站都会记录客户使用的操作系统或者浏览器版本,并存储在数据库中)
•Cookie:网站为了识别用户身份和进行会话跟踪而存储在用户本地终端的数据(通常是加密的)
•X-Forwarded-For:简称XFF头,它代表客户端,即HTTP请求者的真实IP。 (一般有些网站的防注入功能会记录请求者的真实IP地址,写入数据库或者文件中【通过更改XXF头可以实现假IP】)
•Client-IP:本地IP
•Referer:浏览器向WEB 服务器指示它是从哪个页面链接的。
• 主机:客户端指定要访问的WEB 服务器的域名/IP 地址和端口号。
正常注射
普通注入是指可以直接使用工具注入的漏洞。 比较简单。 手动并集查询可以直接查询漏洞存在注入漏洞网站源码,如下图
我们常见的漏洞方式有两种,一种是int,一种是string(整数和字符串类型)。 注入字符串时,需要使用单冒号和双冒号来结束。 下面我们来演示一下。
打开Navicat建立数据库admin并建立use表。
输入命令
mysql> INSERT INTO user(id,username,password,email)VALUES(3,"admin1","123546","13@163.com"); Query OK, 1 row affected mysql> INSERT INTO user(id,username,password,email)VALUES(4,"admin3","123546","1123@163.com"); Query OK, 1 row affected mysql> INSERT INTO user(id,username,password,email)VALUES(2,"admin","123546","12113@163.com"); Query OK, 1 row affected
常用语句的增删改查
降低数据; 插入库(第 1 列、第 2 列...)值(值 1、值 2...)
INSERT INTO user(id,username,password,email)VALUES(3,"admin1","123546","13@163.com");
在管理中插入用户(id,用户名,密码,电子邮件)
value()指的是上面对应的数据运行语句
INSERT INTO admin.user(id,username,password,email)VALUES(4,"admin4","123546","13ghsd@163.com");
我们已经添加成功了
查询语句 select*fromadmin.userwhereid
这句话是我们最常见的,常见的注射也是在这里形成的。 最简单的整数注入时在前面加一个冒号看返回值,返回错误,还有and1=1、and1=2的逻辑判断。
数字注入测试步骤及其背后的疑问
假设网址是
'
后面这句是select*fromtablewhereid=87'
此类语句经常会出现错误,导致页面无法正常显示。
且1=1
选择*fromtablewhereid=87and1=1
页面正常,返回数据与正常数据相同。
这次的SQL语句编程
选择*fromtablewhereid=87'and1=2,
虽然语句正常,很难查询到数据,但由于and1=2仍然为false,导致返回的页面与原来的请求不一样。
字符型注入与承德略有不同
当输入是字符串时,注入需要用单个冒号结束。 字符注入最重要的是如何关闭SQL语句,注释掉多余的代码。 当查询内容为字符串时存在注入漏洞网站源码,SQL语句如下
选择*fromtablewhere用户名='admin'
为什么注入字符类型且1=1时无法正常查询? 看下面这句话
选择*fromtablewhere用户名='adminand1=1'
由于adminand1=1会被数据库作为查询字符串使用,如果要注入,必须考虑字符串的闭包。
select*fromtablewhereusername='admin'and1=1--'
测试源码
<?php $servername = "localhost"; $dbusername = "root"; $dbpassword = "root"; $dbname = "admin"; $id=$_GET['id'];//id未经过滤 $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); mysql_select_db($dbname,$conn); mysql_query('set names utf8'); $sql = "SELECT * FROM article WHERE articleid='$id'"; echo $sql."
"; $result = mysql_query($sql,$conn); $row = mysql_fetch_array($result); echo "利用SQL注入漏洞拖库
"; if (!$row){ echo "该记录不存在"; exit; } echo "标题
".$row['title'].""; echo "内容
".$row['content'].""; ?>
我在审计中所做的是
找到输入点,按照输入信息,是否可以使用,构造注入语句,验证漏洞,
作为本文的热身,技术点不是很高。 前面的文章提到了,关于SQL注入还有很多文章要写,包括代码审计,一定要推下去。 说实话,如果你想要那个技术集中度,就会非常深。 是的,我可能每三天或每天更新一次,以便更好地根据用于编写它的代码、原理和工具来构建主要文章。 如果我有足够的时间,我会更好地思考每一篇文章。
此外,在本文中,鼓励两名男子陪同
Dancha和Tone在此感谢两位巨头常年活跃在透云笔记官方群中。 他们也希望两家巨头的技术能够提升到一个更高的水平,穿透云能够与大家共同进步。
Dancha和Tone在此感谢两位巨头常年活跃在透云笔记官方群中。 他们也希望两家巨头的技术能够提升到一个更高的水平,穿透云能够与大家共同进步。