0x01上源码:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
分析重点:
$query = " SELECT first_name, last_name FROM users WHERE user_id = '$id'; ";
拆除查询时候使用的语句:
select first_name,last_name from users where user_id='$id';
0x02 进行注入时候,分析真正在执行的语句:
注意:下面的语句,所有都忽略掉了鼠标点击后的,&sbumit=submit //能力有限
1.输入: ' ①真正传过去的语句是: select first_name,last_name from users where user_id=''' ②结果也是如此显示的,如下图所示有三个单引号: 2.输入:1 and 1=1 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1 and 1=1’ ②如下图所示,为了达到效果,我输入了 1 and 1=1' ,可以看出若输入1 and 1=1,则真正传过去的是:‘1 and 1=1’
**③注意:本应该输入,1 and 1=1对吧。为什么我要输入1 and 1=1'呢,我是为了验证,系统会在输入的代码前后自动闭合,因为只有输错才会显示如图所示的内容。
④注意:红色框框外的,是高亮显示,只是起到了强调的意思,也就是根本没关系
⑤注意:如果我输入1 and 1=1呢,那么系统自动闭合后为:'1 and 1=1',这个正常输入,无可否认**
3.输入:1 and 1=2 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1 and 1=2’ ②如下图所示,为了达到效果,我输入了 1 and 1=2' ,可以看出若输入1 and 1=2,则真正传过去的是:‘1 and 1=2’
③**注意:如果我输入1 and 1=2呢,那么系统自动闭合后为:'1 and 1=2',问题来了,为什么1=2位恒假,还是这正常输入,正常回显呢?我理解为,在字符型注入中,若输入整型的结构,这个and逻辑判断语句就不起到作用了。**
4.输入:1' and '1'='1 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ and ‘1’=‘1’ ②如下图所示,红框框里的是自己输入的1’ and ‘1’='1,其实在传到后台服务时候会自动闭合,也就是 ‘1’ and ‘1’=‘1’
③有回显,有语句被执行的原因:
第一个表达式:select first_name,last_name from users where user_id='1'
逻辑与符号: and
第二个表达式: '1'='1'
因为1=1恒真,所以前面的语句被执行了
5.输入:1’ and ‘1’='2 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ and ‘1’=‘2’ ②如下图所示,输出后,无任何的回显,那就说明没有任何的查询语句被执行。
**③没有回显,也就是没有语句被执行的原因:**
第一个表达式: select first_name,last_name from users where user_id='1'
逻辑与符号: and
第二个表达式:'1'='2'
因为1=2恒假,所以前面的语句不执行!
6.输入: 1’ order by 2 # ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ order by 2 #’ ②如下图所示,正常输入并正常回显,因为#把’给注释掉了。(#是注释符) ③分析: 第一条语句:select first_name,last_name from users where user_id=‘1’ 第二条:order by 2 最后是注释语句: # ’