在文章之前先提一下~~~ Jdrops0同学问到上次的黑客技能训练网址是这个:https://www.vulnhub.com国外的一个不错的网站。
由于这几天忙着面试的准备和其他一些文档的整理,所以没有更新和查看公众号~~~,黑客技能训练第三弹的write up这几天也会出,感谢大家支持。
其实这三篇write up主要是要写Linux下提权的三种思路,至于渗透的过程,大家娱乐下,看看就好,没什么亮点。第三种方法是这个长什么样子的,有兴趣的同学可以提前去安全客网站上看:http://bobao.360.cn/learning/detail/304.html很不错呦!
可惜他们没有write up,中文版的也没有。言归正传,这次黑客技能训练之Linux提权篇完成就要更新一些比较详细,细致的基础知识了,可能面试会问到哦,面试中的坑,也许你平常没注意到~~
Q&A:什么是注入?注入有哪些分类?
Sql注入就是把SQL命令插入到用户可以与服务器请求交互的点,最终达到欺骗服务器执行恶意的SQL命令。
至于sql的分类,这篇文章会详细说出。
00x1 数字型注入
以php为例子,我们首先新建一个叫做users的数据库,新建两个表,分别为news和users插入以下语句:
MariaDB [injection]> insert usersvalues('test1','123',1);
Query OK, 1 row affected (0.00 sec)
MariaDB [injection]> insert usersvalues('test2','456',2);
Query OK, 1 row affected (0.00 sec)
MariaDB [injection]> insert usersvalues('test3','789',3);
Query OK, 1 row affected (0.00 sec)
MariaDB [injection]> insert usersvalues('admin',MD5(‘adminhack’)‘,4);
Query OK, 1 row affected (0.00 sec)
MariaDB [injection]> insert newsvalues('today\'s news','it is the best day,and
there are some interestingthings',1);
Query OK, 1 row affected (0.00 sec)
新建一个news.php文件,源码如下:
<?php
$conn =mysql_connect('localhost','root','vaf') or die("bad connect thehost");
mysql_select_db('injection',$conn) ordie("database connect error");
$id =$_GET['id'];
$sql = "select * from news where id= $id";
$result = mysql_query($sql,$conn) ordie(mysql_error());
$row = mysql_fetch_array($result);
echo"<b>title:</b>".$row['title']."<hr>";
echo"<b>content:</b>".$row['content']."<hr>";
?>
输入一撇 ’ ,报错了,因为这样造成引号没有闭合导致了sql引号成双成对的爱情梦破灭。
那么同样,我们可以进行union查询。
为什么注入中要用哦order by 进行字段数的判断呢?
Order by 明明是一个对结果集进行排序的函数。
Sql默认order by 后面的数字为id :SELET * FROM news WHERE id=1 ORDER BY id [参数] ASC [参数] LIMIT 10,10 [参数]
这里到了字段4就报错,3正常,说明有四个字段(列)。
那我们可以构造sql语句查询users这个表,当然了,你要加union 来合并多个select语句的结果集。
http://192.168.217.128/1.php?id=1%20and%201=2%20union%20select%201,2,3%20from%20users
为什么后面要加select 1,2,3 from users呢?
union 关键字前后的查询返回的列数必须相同,不然没法拼接成一个表
比如:你的这个查询前面返回了6列,后面的查询只返回了3列。缺少的列可以通过显示地指定Null来补充。
我们要查询users表中的admin 和admin对应的password没错,但是要用1,2,3来补齐字段。
那为什么我查询出来的这条记录不死admin呢?你要知道。这个两个字段中不止admin这条记录,数据库一般会显示出第一条记录。
默认的语句就是:
http://192.168.217.128/1.php?id=1and 1=2 union select username,password,3 from users limit 0,1
limit这个函数,比如:elect * from tablename limit m,n即取出第m+1到n+m(m的索引值是从0开始的)。
Ok,看图。我的第一条数据是test2(没有设置主键AUTO_INCREMENT)。所以注入出来是test2,456。
那么我们换成这样http://192.168.217.128/1.php?id=1 and 1=2union select username,password,3 from users limit 3,4
就爆出了admin和admin的密码了
当然mysql5.0以上有imformation_schema这里,就不多说。只是提大致分类,理清思路。
00x2 字符型注入
比如登陆框,搜索框,甚至在url处都有存在。
有人会问注入还不是分cookie注入、post注入、盲注、延时注入么?其实只是字符型和数字型的多种表现形式。
因为我们是对数据库注入,个人认为分类应该从数据类型来分类。
以下是常见的注入叫法:
POST注入:注入字段POST数据中。
Cookie注入:注入字段在cookie字段中。
延时注入:使用数据库延时特性注入。
搜索注入:注入处为搜索的地点。
Base64注入:注入的字符串需要经过base64加密。
.
.
.
字符型注入:
我们同样用上面的数据库,但是我们用以下的代码来实验。
<?
$name=$_GET['title'];
$conn=mysql_connect("127.0.0.1","root","vaf");//连接mysql数据库
if($conn){
echo "ok!";
}//判断连接是否成功
mysql_select_db('injection',$conn);//选择连接请求为conn的数据库(fanke)
$sql="select* from news where title='$name'"; //字符型搜索语句
$result=mysql_query($sql);
$row =mysql_fetch_array($result);
echo "标题:".$row['title']."<br >";
echo "内容:".$row['content']."<br >";
mysql_close($conn);//关闭数据库连接
echo"<hr>";
echo "你当前执行的sql语句为:";
echo "select* from user where title='$name'";
这里的title值就是字符类型了。
那么我么最重要的是闭合单引号,不然会使得sql语句报错。单引号永远是成双成对的。
http://192.168.217.128/3.php?title=new1' order by 1 or '1'='1
同样注入的手法可以参考以上。